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

我的猜测是您(有意或无意)将名称列存储为 BLOB 而不是 TEXT。这不是=文本值,而是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 回答