SQLITE标识符

时间:2015-08-03 13:43:42

标签: sqlite parameters special-characters bind identifier

我正在尝试构建一个SQL参数自动绑定到新查询的系统。根据这个帖子:

SQL Server - Invalid characters in parameter names

在标识符中应允许使用@,_和#字符。所以我尝试将参数构建为:

:表名#字段名

但是在做的时候我会收到错误:

  

PBdatabase.select_query:[1] DB [2] prepare()SELECT * FROM creature WHERE pk =:creature #pk [near" #pk&#34 ;: syntax error]

它似乎不喜欢#字符,我尝试使用下划线,它似乎工作但我已经在字段名称中使用下划线。这就是为什么我想使用不同的角色。

由于上面讨论的SQL服务器,SQLITE中受限制的字符可能不同。我找到了SQLITE限制关键字列表,但没有找到字符。

有谁知道我可以使用哪个特殊角色?

更新

有人想知道我对此有何用处。这是一个例子,假设您有2个表与1到N的关系:Fleet包含船只。

您希望显示由2个区块组成的表单,其中顶部显示1在此时选择了车队。底部块列出了船队中的所有船只。

第一个块查询将类似于:

SELECT pk, number, location  FROM fleet;

然后,所选条目的字段将放入具有以下名称的字段注册表中(假设#符号有效):

:fleet#pk
:fleet#number
:fleet#location

然后将运行第二个块的第二个查询,包括上面的注册字段。所以查询看起来像:

SELECT pk, fk_fleet, name  FROM ship WHERE fk_fleet = :fleet#pk

此查询使用上述查询中的参数。标识符将替换为上一个查询中的值。这样只允许显示与上面所选船队相关联的船只,而不是所有可用的船只。

现在有些人可能会说我可以简单地保存我想要的变量并将它们传递给下一个查询。问题是所有查询都是从数据库加载的。我实际上不知道我要运行哪个查询以及我需要为另一个查询保存哪个值。相反,我将它们全部保存在注册表中,如果另一个SQL语句要求参数,则该值将可用。

2 个答案:

答案 0 :(得分:0)

SQLite和SQL相似,但是略有不同。另外,SQL的不同实现通常具有不同的规则。

SQLite基本上允许以下字母:A-Za-z0-9,{{1} },_,第一个字符后的成对冒号$和大于u007f的unicode字符。

此外,在参数的末尾,可以添加括号:"::"(,括号之间可以是除ASCII空格字符和)字符之外的任何字符。也不允许使用)(因为它表示C字符串的结尾)。

示例

因此以下参数有效:

0x00:a:_:$:a:::A:9: (U + 2000,四边形字符Unicde),: 

这些无效:

:a(:/$asd():#::::::;:((普通ASCII空间)

来源

我在SQLite网站上找到了一篇文章(请参阅https://www.sqlite.org/draft/tokenreq.html),其中指定了命名参数(也称为变量)可以包含:

  

“参数名称”定义为一个或多个的序列   由ALPHANUMERIC字符和/或   美元符号(u0025)与成对的冒号(u003a)和   可选地,后面跟着任何非零,非白空间的序列   用括号括起来的字符(u0028和u0029)。

其中ALPHANUMERIC字符定义为:

  

字母表   u0041至u005a范围内的任何字符(字母“ A”至“ Z”)   或范围介于u0061至u007a(字母“ a”至“ z”)或字符   u005f(“ _”)或大于u007f的任何其他字符。

  

数字   u0030到u0039范围内的任何字符(数字“ 0”到“ 9”)

我还编写了一个简短的Python脚本来确认上述值。 Unicode字符:( )0xd800也不起作用,原因是Python3拒绝使用这些值创建字符串(原因请参见https://en.wikipedia.org/wiki/UTF-16#U+D800_to_U+DFFF),因此这可能在SQLite C中起作用代码。

0xdfff

答案 1 :(得分:-1)

在SQLite中,查询参数名称只能包含字母数字字符(?NNN除外,它必须是整数);请参阅sqlite3_bind_*函数参考的第二段。