我使用的商业数据库提供了以下字段:
Super Crew 5 1/2' Bed 4WD // where single quote (') symbolizes feet
当需要在 SQL 查询中使用此字段时,它会展开类似于以下摘录:
...WHERE TitleIndex.Title='Super Crew 5 1/2' Bed 4WD'
导致错误消息查询表达式缺少运算符。预期的字符串文字部分 >>> Bed 4WD'<<< 由于其前面的单引号而无法理解。
注意:如果我手动编辑数据库字段以将 >'< 替换为 >ft.<:
'Super Crew 5 1/2ft. Bed 4WD'
查询有效。但是每次交付新数据库时都编辑所有包含单引号的字段是不切实际的。
我查看了参数化,但这将不起作用,因为该字段仍需要使用另一个单引号对嵌入该字段的单引号进行转义:
SET @Value = 'Super Crew 5 1/2'' Bed 4WD'
同样,这需要编辑,这对我们来说不是一个选项。
由于我无法转义提供字段中嵌入的单引号,有没有办法将其打包到查询字符串中,这样它就不会被拒绝为非法查询?
EDIT(显示功能问题存在)
请注意,在下面的代码中,char *title
是在之前的调用中获得的,它包含与存储在数据库中一样的列数据。 >>>Super Crew 5 1/2' Bed 4WD<<<
int AMSDB_API ams_get_tid_from_title(char *title, int *titleId)
{
int index, status, iStatus, tid;
char query[500];
sprintf (query, "SELECT TitleIndex.TitleId FROM TitleIndex WHERE TitleIndex.Title=\'%s\'", title);
hstmt = DBActivateSQL(hAmsIndex, query);
//numberRecords = DBNumberOfRecords(hstmt);
status = DBBindColInt (hstmt, 1, &tid, &iStatus);
DBFetchNext(hstmt);
DBDeactivateSQL(hstmt);
*titleId = tid;
return status;
}
最佳答案
如您所知,要在查询字符串中使用单引号,需要使用另一个单引号对其进行转义。
作为最简单/最快实现的解决方案,您可以在 C 函数中“转义”标题字符串。您将搜索字符串(标题)作为 char *
的引用,使用此字符串引用,您可以找到任何单引号并用另一个单引号将它们转义。然后在您的查询中使用这个修改后的字符串。
抱歉,我不提供代码,C 不是我的强项。
关于sql - 嵌入字段中的单引号 _'_ 会阻止成功的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25122914/