2

Есть таблица улиц, ищу в ней, например, улицу Ленина...

Пишу так:

select name from streets where name like 'Лен%'

Ищет. Пишу так:

select name from streets where name like 'лен%'

Не ищет.

Оказалась проблема с регистром. В MySQL проблем с этим нет (адаптирую запросы с него). Что нужно сделать, чтобы SQLite не обращал внимание на регистр букв, также как и MySQL?

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
sitev_ru
  • 2,042

2 Answers2

1
select name from streets where ucase(name) like 'ЛЕН%'
Deleted
  • 371
BuilderC
  • 2,850
  • наверное имелось в виду это: select name from streets where upper(name) like 'ЛЕН%'

    но тоже не работает корректно

    – sitev_ru May 20 '14 at 11:43
  • И не забыть привести лен к верхнему регистру перед подстановкой в запрос. Костыль конечно, но по идее должно работать. – MrClon May 20 '14 at 18:17
  • UPPER и LOWER в SQLite работает только с ASCII – Владислав Климов Aug 23 '16 at 15:08
1

Чувствительность LIKE к регистру в SQLite управляется переменной case_sensitive_like. Соответственно

PRAGMA case_sensitive_like=ON;  # FOO != foo
PRAGMA case_sensitive_like=OFF; # FOO == foo

НО! На сколько я понял нечувствительность к реестру (case insensivity) в sqlite из коробки работает только для латиницы. Объясняется это, на сколько я понял, тем что реализация нечувствительности к регистру для всего юникода потребовала-бы забивать sqlite очень много данный (вида ф=Ф, ы=Ы), а sqlite он всё-таки lite. Но есть какая-то возможность впилить в него поддержку case insensivity для кириллицы. Честно признаюсь что все мои знания по этому вопросу получены из беглого проглядывания этой статьи на хабре, к ней вас и отсылаю.

P.S. LIKE не лучший инструмент для полнотекстового поиска. Если поиск улицы это какая-то единичная задача то можно конечно обойтись этим, но всё-же полезно знать про специализированные инструменты полнотекстового поиска такие как Sphinx или Apache Lucene.

MrClon
  • 1,650