LINUX.ORG.RU

[MySQL] LIKE case-insensitive ?

 


0

0

Во всех доках написано, что типа TEXT нечуствителен к регистру и оператор LIKE тоже не чувствителен. Тогда почему у меня происходит вот так?

mysql> select * from books where author like '%Низов%';
+----+-------------------------+---------------------------------+-------------- ---------------+-------------+--------+-------------+--------+------------+----- ---------+---------+--------+--------------------------------------------------- ---+
| id | author | title | subtitle | subsubtitle | volume | translation | editor | pubplace | pubhouse | pubyear | series | annotation |
+----+-------------------------+---------------------------------+-------------- ---------------+-------------+--------+-------------+--------+------------+----- ---------+---------+--------+--------------------------------------------------- ---+
| 2 | Сергей Низов | Поваренная книга | для хомодомяке | NULL | NULL | NULL | NULL | Тарту | TU Kirjastus | 2004 | NULL | Книга рассказывает.. о ЕДЕ :) |
| 3 | Алксей Низов | Антикнига | ни о чем | NULL | NULL | NULL | NULL | Тарту | TU Kirjastus | 2006 | NULL | Книга рассказывает.. не о еде |
+----+-------------------------+---------------------------------+-------------- ---------------+-------------+--------+-------------+--------+------------+----- ---------+---------+--------+--------------------------------------------------- ---+
2 rows in set (0.00 sec)

А если в запросе '%Низов%' исправить на '%низов%', то:

mysql> select * from books where author like '%низов%';
Empty set (0.00 sec)

Какое же оно тогда case-insensetive?


1. Это вроде от collation столбца author зависит, может ты его сделал binary или, как многие, оставил latin-1

2. where lower(author) like '%низов%' не помогает? Вообще кстати что говорит select lower('Низов') ?

Teak ★★★★★
()

Такое было у меня, потому что коллейшн столбца был в utf8_bin. А бинарники, как известно, сравниваются точно. Также нужно проверить
SHOW VARIABLES LIKE 'collation%'

простой вариант в запросе SELECT указать коллейшн:
select * from books where author like '%низов%' collate 'cp1251_general_ci'




Chumka ★★★
()
Ответ на: комментарий от Teak

1. collation я не трогал, ведь binary как раз таки исключает возможность нечуствительного к регистру поиска.

2. Нет, с русскими букавками оно так не хочет :P

kuz
() автор топика
Ответ на: комментарий от Chumka

текс.. пробуем

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

mysql> select * from t1 where author like '%низов%';
+----+-------------------------+---------------------------------+
| id | author | title |
+----+-------------------------+---------------------------------+
| 1 | Сергей Низов | Пожареная книга |
| 2 | Петр Низов | Поваренная книга |
+----+-------------------------+---------------------------------+
2 rows in set (0.00 sec)

О, хохо :)
всем спасибо :)

kuz
() автор топика
Ответ на: комментарий от Teak

Огромное спасибо за подсказку

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.