如何设置Sqlite3字符串比较时不区分大小写?

我想通过字符串匹配从sqlite3数据库选择记录。但是如果我在where子句中使用'=',我发现sqlite3是区分大小写的。有人能告诉我如何使用字符串比较不区分大小写吗?

215427 次浏览

这不是特定于sqlite,但你可以这样做

SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')

你可以这样做:

SELECT * FROM ... WHERE name LIKE 'someone'

(它不是解决方案,但在某些情况下非常方便)

就像操作符执行一个模式 匹配比较。操作数 右边包含模式 左操作数包含字符串 与图案相匹配一个 模式中的百分比符号(“%”) 匹配任何0或更多的序列 字符串中的字符。一个 在模式中下划线(“_”) 中的任意单个字符 字符串。任何其他匹配的字符 本身或它的小写/大写 等价(即不区分大小写 匹配)。(一个错误:仅限于SQLite 理解ASCII的大写/小写 字符。LIKE操作符是case 对unicode字符敏感 超出了ASCII范围。为 例如,表达式'a'像'a' 'æ' LIKE 'Æ'是假的。)" < / p >
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

你可以在SELECT查询中使用COLLATE NOCASE:

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

另外,在SQLite中,你可以在创建表时通过在列定义中指定collate nocase来指示列不区分大小写(其他选项是binary(默认值)和rtrim;见在这里)。你也可以在创建索引时指定collate nocase。例如:

create table Test
(
Text_Value  text collate nocase
);


insert into Test values ('A');
insert into Test values ('b');
insert into Test values ('C');


create index Test_Text_Value_Index
on Test (Text_Value collate nocase);

包含Test.Text_Value的表达式现在应该是不区分大小写的。例如:

sqlite> select Text_Value from Test where Text_Value = 'B';
Text_Value
----------------
b


sqlite> select Text_Value from Test order by Text_Value;
Text_Value
----------------
A
b
C


sqlite> select Text_Value from Test order by Text_Value desc;
Text_Value
----------------
C
b
A

优化器还可能利用索引对列进行不区分大小写的搜索和匹配。你可以使用explain SQL命令来检查,例如:

sqlite> explain select Text_Value from Test where Text_Value = 'b';
addr              opcode          p1          p2          p3
----------------  --------------  ----------  ----------  ---------------------------------
0                 Goto            0           16
1                 Integer         0           0
2                 OpenRead        1           3           keyinfo(1,NOCASE)
3                 SetNumColumns   1           2
4                 String8         0           0           b
5                 IsNull          -1          14
6                 MakeRecord      1           0           a
7                 MemStore        0           0
8                 MoveGe          1           14
9                 MemLoad         0           0
10                IdxGE           1           14          +
11                Column          1           0
12                Callback        1           0
13                Next            1           9
14                Close           1           0
15                Halt            0           0
16                Transaction     0           0
17                VerifyCookie    0           4
18                Goto            0           1
19                Noop            0           0

如果列的类型是char,那么你需要在你要查询的值后面加上空格,请参考这个问题在这里。这除了使用COLLATE NOCASE或其他解决方案之一(upper()等)。

另一种选择是创建自己的自定义排序规则。然后可以在列上设置排序规则,或将其添加到选择子句中。它将用于排序和比较。

这可以用来使'VOILA'像'voilà'。

http://www.sqlite.org/capi3ref.html#sqlite3_create_collation

排序函数必须返回一个整数,如果第一个字符串分别小于、等于或大于第二个字符串,则该整数为负、零或正。

另一种选择可能对您的情况有意义,也可能没有意义,那就是实际上有一个单独的列,其中包含现有列的预先低分值。可以使用SQLite函数LOWER()填充该列,然后可以对该列执行匹配。

显然,它增加了冗余和潜在的不一致性,但如果您的数据是静态的,它可能是一个合适的选择。

可以使用like查询将各自的字符串与表值进行比较。

Select column name from table_name where column name like '各自的比较值';

它为我工作完美。 SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE < / p >

简单地说,你可以在SELECT查询中使用COLLATE NOCASE:

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

像这样使用

 "select * from $pwsXDataHistory where type = '$type' COLLATE NOCASE and $t_uStatus != '$DELETE' order by $t_name COLLATE NOCASE asc ");