2013-02-11 15 views
1

我有很簡單的SQLite表:SQLite的:LIKE匹配值,但平等並不

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肯定存在(我看到它時做SELECT *),在開始和結束沒有任何空格,並具有相同的情況下所有字符。 什麼是平等運算符和LIKE不同行爲的原因?

+0

@gordon:SQLite的,而不是在mysql – 2013-02-11 20:22:05

+0

嗨,不,因爲我在我的問題直接寫入,沒有空格在結束和開始,我使用SQLite C++ API來獲得與SELECT *的數據,所有數據沒有空格。 – Vitaliy 2013-02-11 20:25:27

+0

您使用的是哪個版本的sqlite?我用'sqlite3'-cli在我的系統上用3.7.13測試了它,它工作正常。 – 2013-02-11 20:29:14

回答

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

+0

PRAGMA case_sensitive_like = TRUE不會改變我的情況; LIKE仍然返回1行,=返回0個 – Vitaliy 2013-02-11 20:52:23

+0

可能你發佈了.dump設置命令的輸出? (.output setting.sql會將輸出重定向到一個文件) 它可能有一些有用的信息,說明這個值是如何準確存儲的 – 2013-02-11 21:25:37

+0

它看起來像我exp錯誤SQLite中的任何錯誤。我繼續使用同一個數據庫進行測試,在其他表上,我開始接受prepare_v2調用SQLITE_INTERNAL錯誤的非常簡單的查詢,這些查詢不會出錯(如SELECT * FROM'table')。另一方面,PRAGMA integrity_check給出了OK。我甚至用.dump導出數據並將其導入空數據庫,但結果相同。根據他們的文檔,SQLITE_INTERNAL表示SQLite中的錯誤。 – Vitaliy 2013-02-12 19:09:30

1

您可能會遇到sqlite的類型系統。全部細節上http://www.sqlite.org/datatype3.html,但相關位是這樣的:

A TEXT value is less than a BLOB value 

我的猜測是,你(有意或無意)存儲的名稱列作爲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>