Sqlite:LIKE匹配值,但是相等不匹配

时间:2013-02-11 20:16:06

标签: sql sqlite

我有非常简单的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的不同行为的原因?

2 个答案:

答案 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