Как установить sqlite3 для нечувствительности к регистру при сравнении строк?

Я хочу выбрать записи из базы данных sqlite3 путем сопоставления строк. Но если я использую ' = ' в предложении where, я обнаружил, что sqlite3 чувствителен к регистру. Может ли кто-нибудь сказать мне, как использовать сравнение строк без учета регистра?

10 ответов


можно использовать COLLATE NOCASE в своем SELECT запрос:

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                                            

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

вы можете сделать это так:

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

(не на решение, но в некоторых случаях очень удобно)

как оператор делает шаблон сопоставительное сравнение. Операнд право содержит шаблон, левый операнд содержит строку чтобы соответствовать шаблону. Ля символ процента ("%") в шаблоне соответствует любой последовательности из нуля или более символы в строке. - подчеркивание ( " _ " ) в узор соответствует любому символу в строка. любой другой символ соответствует сам или его нижний/верхний регистр эквивалент (т. е. без учета регистра согласования). (Ошибка: только SQLite понимает, верхний/нижний регистр для ASCII письмена. Оператор LIKE-это case чувствительный для символов unicode, которые находятся за пределами диапазона ASCII. Для например, выражение " a "подобно " A" это правда, но " æ "подобно " Æ" ЛОЖНЫЙ.)."


Это не относится к SQLite, но вы можете просто сделать

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

другой вариант-создать собственные параметры сортировки. Затем можно задать параметры сортировки в столбце или добавить их в предложения select. Он будет использоваться для упорядочения и сравнения.

Это можно использовать, чтобы сделать "вуаля", как "вуаля".

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

упорядоченной функция должна возвращать целое число, которое является отрицательным, нулевым или положительным, если первая строка меньше, равно или больше второго соответственно.


другой вариант, который может иметь или не иметь смысла в вашем случае, - это иметь отдельный столбец с предварительно пониженными значениями существующего столбца. Это может быть заполнено с помощью функции SQLite LOWER(), а затем вы можете выполнить сопоставление в этом столбце.

очевидно, что это добавляет избыточность и потенциал для несогласованности, но если ваши данные статичны, это может быть подходящим вариантом.


Если столбец имеет тип char тогда вам нужно добавить значение, которое вы запрашиваете с пробелами, пожалуйста, обратитесь к этому вопросу здесь . Это в дополнение к использованию COLLATE NOCASE или одно из других решений (upper () и т. д.).


вы можете использовать подобный запрос для сравнения соответствующей строки с таблицей vales.

выберите имя столбца из table_name, где имя столбца, как "соответствующее значение сравнения";


просто вы можете использовать COLLATE NOCASE в своем запросе SELECT:

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

его работа для меня отлично. SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE