Есть ли какое-либо правило для имени столбца SQLite?
- Может ли он иметь символы типа '/'?
- Может ли это быть UTF-8?
Есть ли какое-либо правило для имени столбца SQLite?
http://www.sqlite.org/lang_keywords.html, который имеет полный список! наслаждайтесь!
Может ли он иметь символы типа '/'?
Все примеры из 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
Тем не менее, вы, вероятно, не должны этого делать.
Допустимые имена полей подчиняются тем же правилам, что и допустимые имена таблиц. Проверено это с помощью администратора SQlite.
Придерживайтесь этих и не требуется экранирование, и это может избежать будущих проблем.
Следующий ответ основан на исходном коде SQLite, в основном полагающемся на файл parse.y
(ввод для анализатора лимона).
Разрешенная серия символов для имен столбцов и таблиц в операторах CREATE TABLE
'
- экранированные строки любого типа (даже ключевые слова)INDEXED
, потому что оно нестандартноJOIN
по неизвестной мне причине.Разрешенная серия символов для столбцов результатов в выражении SELECT
:
AS
рассмотрим синтаксис столбцов 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;}
углубляясь, мы обнаруживаем, что
// 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
.
Пока неясно, какие доступные имена для 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;}
За исключением размещения имен "незаконных" идентификаторов между двойными кавычками "идентификатор №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