代码之家  ›  专栏  ›  技术社区  ›  prosseek

SQLite列名可以是/不能是什么?

  •  34
  • prosseek  · 技术社区  · 14 年前

    • 它能有像“/”这样的字符吗?
    • 是UTF-8吗?
    5 回复  |  直到 14 年前
        1
  •  16
  •   kroimon    10 年前

    它能有像“/”这样的字符吗?

    所有示例都来自运行在Linux上的SQlite 3.5.9。

    如果将列名用双引号括起来,则可以:

    > CREATE TABLE test_forward ( /test_column INTEGER );
    SQL error: near "/": syntax error
    > CREATE TABLE test_forward ("/test_column" INTEGER );
    > INSERT INTO test_forward("/test_column") VALUES (1);
    > SELECT test_forward."/test_column" from test_forward;
    1
    

    也就是说, .

        2
  •  7
  •   user35443    7 年前

    parse.y (lemon解析器的输入)。

    中允许的列名和表名字符序列 CREATE TABLE 语句是

    • ' -任何类型的转义字符串(甚至关键字)
    • 标识符,意思是
      • ```以及 " -任何类型的转义字符串(甚至关键字)
      • 一系列的 MSB=1 8位ASCII字符或7位ASCII字符 1 在下表中 不构成关键字 : Valid identifier characters
    • 关键字 INDEXED 因为这是不标准的
    • JOIN 因为我不知道的原因。

    中结果列允许的字符序列 SELECT

    • 如上所述的字符串或标识符
    • 如果用作列别名,则在 AS

    现在谈谈探索过程本身

    1. 让我们看看 创建表

      // The name of a column or table can be any of the following:
      //
      %type nm {Token}
      nm(A) ::= id(X).         {A = X;}
      nm(A) ::= STRING(X).     {A = X;}
      nm(A) ::= JOIN_KW(X).    {A = X;}
      
    2. // An IDENTIFIER can be a generic identifier, or one of several
      // keywords.  Any non-standard keyword can also be an identifier.
      //
      %type id {Token}
      id(A) ::= ID(X).         {A = X;}
      id(A) ::= INDEXED(X).    {A = X;}
      

      tokenize.c 然而,它给出了一个定义

      /*
      ** The sqlite3KeywordCode function looks up an identifier to determine if
      ** it is a keyword.  If it is a keyword, the token code of that keyword is 
      ** returned.  If the input is not a keyword, TK_ID is returned.
      */
      
      /*
      ** If X is a character that can be used in an identifier then
      ** IdChar(X) will be true.  Otherwise it is false.
      **
      ** For ASCII, any character with the high-order bit set is
      ** allowed in an identifier.  For 7-bit characters, 
      ** sqlite3IsIdChar[X] must be 1.
      **
      ** Ticket #1066.  the SQL standard does not allow '$' in the
      ** middle of identfiers.  But many SQL implementations do. 
      ** SQLite will allow '$' in identifiers for compatibility.
      ** But the feature is undocumented.
      */
      

      标记化.c

    3. 目前还不清楚一家公司的可用名称是什么 result-column 声明)。 在这里也很有用。

      // An option "AS <id>" phrase that can follow one of the expressions that
      // define the result set, or one of the tables in the FROM clause.
      //
      %type as {Token}
      as(X) ::= AS nm(Y).    {X = Y;}
      as(X) ::= ids(Y).      {X = Y;}
      as(X) ::= .            {X.n = 0;}
      
        3
  •  3
  •   Cris Luengo    5 年前

    除了在双引号之间加上“非法”的标识符名称 "identifier#1" , [ 之前和 ] [identifire#2] .

    sqlite> create table a0.tt ([id#1] integer primary key, [id#2] text) without rowid;
    sqlite> insert into tt values (1,'test for [x] id''s');
    sqlite> select * from tt
       ...> ;
    id#1|id#2
    1|test for [x] id's
    
        4
  •  2
  •   collectordave    8 年前

    1. 只允许使用字母数字字符和下划线
    2. 字段名必须以字母字符或下划线开头