Какое имя столбца SQLite может быть / не может быть? - PullRequest
35 голосов
/ 30 июля 2010

Есть ли правило для имени столбца SQLite?

  • Может ли оно содержать символы типа '/'?
  • Это может быть UTF-8?

Ответы [ 5 ]

22 голосов
/ 30 июля 2010

http://www.sqlite.org/lang_keywords.html с полным списком! наслаждайтесь!

11 голосов
/ 30 июля 2010

Может ли он содержать такие символы, как '/'?

Все примеры взяты из SQlite 3.5.9, работающей в Linux.

Если вы окружите имя столбца двойнымцитаты, вы можете:

> 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

Тем не менее, вы, вероятно, не должны делать это .

3 голосов
/ 19 августа 2017

Следующий ответ основан на исходном коде SQLite, в основном опираясь на файл parse.y (вход для анализатора лимона).

TL; DR:

Допустимая серия символов для имен столбцов и таблиц в операторах CREATE TABLE:

  • ' -экранированные строки любого типа (даже ключевые слова)
  • Идентификаторы, что означает
    • `` `и " -экранированные строки любого вида (даже ключевые слова)
    • серия MSB=1 8-битных символов ASCII или 7-битных символов ASCII с 1 в следующей таблице, в которой не образует ключевое слово : Valid identifier characters
  • Ключевое слово INDEXED, потому что оно нестандартное
  • Ключевое слово JOIN по неизвестной мне причине.

Допустимая серия символов для столбцов результата в операторе SELECT:

  • Либо строка, либо идентификатор, как описано выше
  • Все вышеперечисленное, если используется в качестве псевдонима столбца, написанного после AS

Теперь к самому процессу исследования

  1. давайте посмотрим на синтаксис для CREATE TABLE столбцов

    // 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.
    */
    

    Для полной карты символов-идентификаторов, пожалуйста, обратитесь к tokenize.c.

  3. До сих пор неясно, каковы доступные имена для result-column (т.е. имя столбца или псевдоним, назначенные в операторе SELECT). parse.y снова полезен здесь.

    // 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;}
    
2 голосов
/ 03 марта 2016

Допустимые имена полей подчиняются тем же правилам, что и допустимые имена таблиц.Проверил это с администратором SQlite.

  1. Разрешены только буквенно-цифровые символы и подчеркивание
  2. Имя поля должно начинаться с буквенного символа или подчеркивания

Придерживатьсяони не нужны, и это может избежать будущих проблем.

0 голосов
/ 12 ноября 2017

За исключением размещения "недопустимых" имен идентификаторов между двойными кавычками, "идентификатор # 1" [до и] после работ, а также [идентификатор # 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...