哪些字符必须转义以获得合法的SQLite字符串文字?

SQLite documentation指出:

  

通过将字符串括在单引号(')中来形成字符串常量。可以通过将两个单引号放在一行中来对字符串中的单引号进行编码-如Pascal。不支持使用反斜杠字符进行C样式转义,因为它们不是标准的SQL。

很显然,这还不足以实现一种方法,该方法针对任何输入字符串a返回一个输出字符串b,这样就可以在没有任何进一步操作的情况下安全地将其内插到一个SQL查询,例如

select * from names where name = $b;

很明显,从ab的第一步是用'(两个单引号)替换每次出现的''(单引号),作为最后一步,必须添加前导和尾随单引号。但是,尚不清楚如何将关键字符像换行符一样对待,因为文档仅指出不允许转义。还不清楚哪些字符可能导致问题。

注意,我知道对此类问题的标准答复之一是“不要逃避,请使用参数绑定”,因此,这样做可能是正确的;但是,我使用的接口不允许我编写SQL values元组,因此我必须自己提出解决方案。

ymsabc 回答:哪些字符必须转义以获得合法的SQLite字符串文字?

我刚刚使用单引号之间的实际换行符和制表符进行了测试,并且其功能正常,将这些字符插入数据库字段中。

唯一会引起问题的字符是0字节代码(即NUL字符)。

根据sqlite docs

  

带有嵌入式NUL字符的字符串不能在SQL中表示为字符串文字,因此返回的字符串文字在第一个NUL之前被截断。

,

假设PRAGMA encoding="UTF-8";有效,唯一需要关注的(Unicode)字符是单引号和NULL(U + 0000)。

如果要用相应的字符替换Unicode转义,可以使用SQLite的json_extract函数。以下是一些示例:

输入:

select 'a
b'; 

select 'é';

select json_extract('"\u00e9"','$');

输出:

a
b
é
é

NUL

在sqlite3命令行提示符下,文字NUL似乎消失了,

select length('a' || 'x^@y' || 'b'); -- where ^@ stands for NUL
4

但是,使用其他输入法:

 select ('a' || 'x�y' || 'b');
 ax�yb
本文链接:https://www.f2er.com/3165056.html

大家都在问