2016-03-31 5 views
0

私は奇妙に見えるものにぶつかったが、私はsqlite3を悪用するかもしれない。sqliteの列名の引用(機能やバグ)

create table t (v[0] text); 
insert into t values('aa'); 
select * from t; 
v 
-------- 
aa 
pragma table_info('t') 
cid  name  type no dfl pk 
-------- -------- ------ -- --- ---------- 
0  v  0  0  0 
.schema t; 
CREATE TABLE t (v[0] text); 

列名が正しく、スキーマに入力され、それが「誤って」静かに任意のレポートせずに列名を切り捨てる者選択/作成によって処理されると思ったように見えます。

ここで、このような奇妙な列名をスキーマに引用符で入力する必要があると思うかもしれませんが、私はそれを行う方法を見つけることができません。スキーマがよさそうだ

create table u ('v[0]' text); 
insert into u values('aa'); 
select * from u; 
v[0] 
-------- 
aa 
$ q pragma table_info('u') 
cid  name  type no dfl pk 
-------- -------- ------ -- --- ---------- 
$  v[0]  text 0  0 
$ q .schema u 
CREATE TABLE u ('v[0]' text); 

万歳は、SELECT *は幸せですが、今、私はこのコラムの使用方法については動けなくなります。

select v[0] from u; 
SQL error 1 : no such column: v 
select 'v[0]' from u 
'v[0]' 
---------- 
v[0] 
select [v[0]] from u 
SQL error 1 : unrecognized token: "]" 

私は実際に列名に[]持っているし、私はすべての助言のために

ありがとう(列名が私の場合に生成された)任意のdoccoは、我々はできないと言っ表示されません。 乾杯 ファイ

+0

どのようにあなたがあなたのカラム名は、角括弧 'V [0]'を含有しなければならない状況にあることも可能です: は引用符の正しい方法は、二重引用符を使用することですか? – Joe

+0

私のカラム名が生成され、 - > []を持つことができます。これまでエンコードを試みたことはありませんでしたが、私はエンコーディング(mangling)のどのような処理が必要なのだろうかと思っています... – Phi

答えて

2

SQLiteはways of quoting table/column namesいくつかをサポートしていますが、[name]'name'だけで、他のデータベースとの互換性のためにサポートされており、単一引用符は文字列リテラルと誤解することができます。

SELECT "v[0]" FROM u; 
+0

私のシェルはkshに埋め込まれています。良い選択肢でしたが、明らかに耳鳴りはありませんでした。 – Phi

関連する問題