SQLite C 接口
SQL 关键字检查
int sqlite3_keyword_count(void); int sqlite3_keyword_name(int,const char**,int*); int sqlite3_keyword_check(const char*,int);
这些例程提供对 SQLite 识别的 SQL 语言关键字集的访问。应用程序可以使用这些例程来确定是否需要转义特定标识符(例如,通过用双引号引起来)以免混淆解析器。
sqlite3_keyword_count() 接口返回 SQLite 理解的不同关键字的数量。
sqlite3_keyword_name(N,Z,L)接口找到第N个关键字,使*Z指向该关键字,表示为UTF8,并将关键字中的字节数写入*L。*Z 指向的字符串不是以零结尾的。如果 N 在范围内,则 sqlite3_keyword_name(N,Z,L) 例程返回 SQLITE_OK,否则返回 SQLITE_ERROR。如果 Z 或 L 为 NULL 或无效指针,则调用 sqlite3_keyword_name(N,Z,L) 会导致未定义的行为。
sqlite3_keyword_check(Z,L) 接口检查 Z 指向的 L 字节 UTF8 标识符是否是关键字,如果是则返回非零,否则返回零。
SQLite 使用的解析器是宽容的。通常可以使用关键字作为标识符,只要这种使用不会导致解析歧义。例如语句“CREATE TABLE BEGIN(REPLACE,PRAGMA,END);” 被 SQLite 接受,并创建一个名为“BEGIN”的新表,其中包含名为“REPLACE”、“PRAGMA”和“END”的三列。然而,最佳做法是避免使用关键字作为标识符。用于避免关键字名称冲突的常用技术包括:
- 将所有标识符名称放在双引号内。这是转义标识符名称的官方 SQL 方法。
- 将标识符名称放在 [...] 中。这不是标准的 SQL,但它是 SQL Server 所做的,因此许多程序员都使用这种技术。
- 每个标识符都以字母“Z”开头,因为没有 SQL 关键字以“Z”开头。
- 在每个标识符名称的某处包含一个数字。
请注意,SQLite 可以理解的关键字数量取决于编译时选项。例如,如果使用-DSQLITE_OMIT_VACUUM选项编译 SQLite,则“VACUUM”不是关键字。此外,新的关键字可能会添加到 SQLite 的未来版本中。