web-dev-qa-db-fra.com

Quel nom de colonne SQLite peut être/ne peut pas être?

Existe-t-il une règle pour le nom de colonne du SQLite?

  • Peut-il avoir des caractères comme '/'?
  • Peut-il être UTF-8?
33
prosseek

http://www.sqlite.org/lang_keywords.html qui a une liste complète! prendre plaisir!

22
Spooks

Peut-il avoir des caractères comme '/'?

Tous les exemples proviennent de SQlite 3.5.9 s'exécutant sous Linux.

Si vous entourez le nom de la colonne entre guillemets, vous pouvez:

> 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

Cela dit, vous ne devriez probablement pas faire cela .

9
J. Polfer

La réponse suivante est basée sur le code source SQLite, principalement sur le fichier parse.y (entrée pour l’analyseur de citron).

TL; DR:

Les séries de caractères autorisées pour les noms de colonnes et de tables dans les instructions CREATE TABLE sont les suivantes:

  • '- échappé des chaînes de tout type (même des mots-clés)
  • Identifiants, ce qui signifie
    • `` `et "- des chaînes échappées de toutes sortes (même des mots-clés)
    • une série de MSB=1 caractères ASCII à 8 bits ou de caractères ASCII à 7 bits avec 1 dans le tableau suivant que ne forme pas un mot clé :  Valid identifier characters
  • Mot clé INDEXED car il est non standard
  • Mot clé JOIN pour une raison inconnue de moi.

Les séries de caractères autorisées pour les colonnes de résultats dans une instruction SELECT sont

  • Soit une chaîne ou un identifiant comme décrit ci-dessus
  • Tout ce qui précède est utilisé comme un alias de colonne écrit après AS

Passons maintenant au processus d'exploration lui-même

  1. regardons la syntaxe des colonnes 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. creuser plus profondément, nous découvrons que

    // 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;}
    

    "Identificateur générique" ne semble pas familier. Un rapide coup d'œil dans tokenize.c amène cependant la définition

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

    Pour obtenir une carte complète des caractères d’identification, veuillez consulter le tokenize.c.

  3. On ne sait toujours pas quels sont les noms disponibles pour un result-column (c'est-à-dire le nom de la colonne ou l'alias attribué dans l'instruction SELECT). parse.y est encore utile ici.

    // 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
user35443

Les noms de champs valides sont soumis aux mêmes règles que les noms de tables valides. Vérifié cela avec l'administrateur SQlite.

  1. Seuls les caractères alphanumériques et le soulignement sont autorisés
  2. Le nom du champ doit commencer par un caractère alpha ou un soulignement

Tenez-vous-en à cela, aucune fuite n'est nécessaire et cela peut éviter des problèmes futurs.

2
collectordave

Sauf pour placer des noms d'identifiant "illégaux" entre guillemets "identifiant # 1" [avant et] après fonctionne également [identifire # 2] 

exemple

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
0
Klaas-Z4us-V