我有非常简单的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
的行确实存在(我在SELECT *
时看到它),在开头和结尾都没有任何空格,并且具有相同的大小写所有人物。
什么是等于运算符和LIKE
的不同行为的原因?
答案 0 :(得分: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>
答案 1 :(得分: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