web-dev-qa-db-ja.com

SQLiteの列名には、どのようなものがありますか?

SQLiteの列名にルールはありますか?

  • 「/」のような文字を使用できますか?
  • UTF-8にできますか?
37
prosseek

http://www.sqlite.org/lang_keywords.html 完全なリストがあります!楽しい!

24
Spooks

「/」のような文字を使用できますか?

すべての例は、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

とはいえ、おそらくこれを行うべきではありません

11
J. Polfer

次の回答は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;}
    
4
user35443

有効なフィールド名には、有効なテーブル名と同じ規則が適用されます。これをSQlite管理者に確認しました。

  1. 使用できるのは英数字と下線のみです
  2. フィールド名は英字または下線で始まる必要があります

これらに固執し、エスケープは不要であり、将来の問題を回避することができます。

2
collectordave

二重引用符で囲んだ「不正な」識別子名を除く"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
1
Klaas-Z4us-V