2

私は非常に単純な SQLite テーブルを持っています:

CREATE TABLE IF NOT EXISTS `settings` (`Name` TEXT PRIMARY KEY, `Value` TEXT);

次の2つのクエリを使用します。

SELECT `Value` FROM `settings` WHERE `Name` LIKE 'MainTabControl.active';

(1 行を返します)

SELECT `Value` FROM `settings` WHERE `Name` = 'MainTabControl.active';

(0 行を返します)

Name列の値を持つ行がMainTabControl.active確実に存在し ( do の場合に表示されますSELECT *)、先頭と末尾にスペースがなく、すべての文字の大文字と小文字が同じです。等値演算子 と の動作が異なる理由は何LIKEですか?

4

2 に答える 2

2

sqlite の型システムに遭遇している可能性があります。完全な詳細はhttp://www.sqlite.org/datatype3.htmlにありますが、関連するビットは次のとおりです。

A TEXT value is less than a BLOB value

私の推測では、(意図的かどうかにかかわらず) name 列を TEXT ではなく BLOB として保存したと思います。これは=テキスト値ではなく、テキスト値になりますLIKE

$ sqlite3
SQLite version 3.7.15 2012-10-15 18:02:57
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table settings (name, value) ;
sqlite> insert into settings values ('MainTabControl.active','textname') ;
sqlite> insert into settings values (cast ('MainTabControl.active' as blob),'blobname') ;
sqlite> select value from settings where name = 'MainTabControl.active' ;
textname
sqlite> select value from settings where name like 'MainTabControl.active' ;
textname
blobname
sqlite> select value, typeof(name) from settings where name like 'MainTabControl.active' ;
textname|text
blobname|blob
sqlite> 
于 2013-02-12T00:32:11.437 に答える
1

LIKE 演算子の大文字と小文字の区別は、PRAGMA case_sensitive_like コマンドによって決定されます。LIKE 演算子のデフォルトの動作は、ASCII 文字の大文字と小文字を無視することです。

sqlite> SELECT 'A' = 'a';
0         
sqlite> SELECT 'A' LIKE 'a';
1           
sqlite> PRAGMA case_sensitive_like = TRUE;
sqlite> SELECT 'A' LIKE 'a';
0 

TRUE に設定すると、結果は = 演算子と等しくなります。http://www.sqlite.org/pragma.html#pragma_case_sensitive_likeを参照

于 2013-02-11T20:37:29.550 に答える