Existe-t-il une règle pour le nom de colonne du SQLite?
http://www.sqlite.org/lang_keywords.html qui a une liste complète! prendre plaisir!
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 .
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).
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)INDEXED
car il est non standardJOIN
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
AS
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;}
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
.
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;}
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.
Tenez-vous-en à cela, aucune fuite n'est nécessaire et cela peut éviter des problèmes futurs.
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