MySQL, соответствующий символам unicode с версией ascii
Я запускаю MySQL 5.1.50 и имею таблицу, которая выглядит так:
organizations | CREATE TABLE `organizations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`url` text CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=25837 DEFAULT CHARSET=utf8 |
проблема, с которой я сталкиваюсь, заключается в том, что MySQL сопоставляет символы unicode с версиями ascii. Например, когда я ищу слово, содержащее "é", оно будет соответствовать тому же слову, которое имеет "e", и наоборот:
mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT id, name FROM `organizations` WHERE `name` = 'Universite de Montreal';
+-------+-------------------------+
| id | name |
+-------+-------------------------+
| 16973 | Université de Montreal |
+-------+-------------------------+
1 row in set (0.01 sec)
Я получаю эти результаты как из PHP, так и из консоли командной строки. Как я могу получить точные матчи из моего SELECT запросы?
спасибо!
5 ответов
указан как text CHARACTER SET utf8 COLLATE utf8_unicode_ci
который говорит MySQL рассмотреть e и é как эквивалент в сопоставлении и сортировке. Это сопоставление и utf8_general_ci
оба делают много вещей эквивалентными.
http://www.collation-charts.org/ Это отличный ресурс, как только вы узнаете, как читать диаграммы, что довольно легко.
если вы хотите e и é etc. быть рассмотренным по-разному после этого вы должны выбрать другую сортировку. Чтобы узнать, какие параметры сортировки находятся на вашем сервере (при условии, что вы ограничены кодировкой UTF-8):
mysql> show collation like 'utf8%';
и выберите использование диаграмм сортировки в качестве ссылки.
еще одна специальная сортировка -utf8_bin
в котором нет эквивалентности, это двоичное совпадение.
только в MySQL сортировки Юникода я знаю, что не зависящие от языка,utf8_unicode_ci
, utf8_general_ci
и utf8_bin
. Они довольно странные. Реальный цель сортировки состоит в том, чтобы компьютер соответствовал и сортировался, как человек откуда-то ожидал. Венгерский и турецкий словари имеют свои записи, упорядоченные в соответствии с различными правилами. Указание параметров сортировки позволяет сортировать и сопоставлять данные в соответствии с такими локальными правилами.
например, кажется, датчане считают E и é эквивалентными, но исландцы не:
mysql> select _utf8'e' collate utf8_danish_ci
-> = _utf8'é' collate utf8_danish_ci as equal;
+-------+
| equal |
+-------+
| 1 |
+-------+
mysql> select _utf8'e' collate utf8_icelandic_ci
-> = _utf8'é' collate utf8_icelandic_ci as equal;
+-------+
| equal |
+-------+
| 0 |
+-------+
еще один удобный трюк, чтобы заполнить одну таблицу столбцов с кучей символов, которые вы заинтересованы in (это проще из скрипта), а затем MySQL может сказать вам эквивалентности:
mysql> create table t (c char(1) character set utf8);
mysql> insert into t values ('a'), ('ä'), ('á');
mysql> select group_concat(c) from t group by c collate utf8_icelandic_ci;
+-----------------+
| group_concat(c) |
+-----------------+
| a |
| á |
| ä |
+-----------------+
mysql> select group_concat(c) from t group by c collate utf8_danish_ci;
+-----------------+
| group_concat(c) |
+-----------------+
| a,á |
| ä |
+-----------------+
mysql> select group_concat(c) from t group by c collate utf8_general_ci;
+-----------------+
| group_concat(c) |
+-----------------+
| a,ä,á |
+-----------------+
одна вещь, которую вы можете сделать со своей строкой запроса, - это ее декодировать...
< ?php
$query="उनकी"; // some Unicode characters
$query=urldecode($query);
$qry= "SELECT * FROM table WHERE books LIKE '%$query%'";
//rest of the code....
?>
это сработало для меня. :)
вы установили параметры сортировки в utf8_unicode_ci
что приравнивает акцентированные латинские символы. Дополнительную информацию можно найти здесь.
я узнал, что вы получаете запрошенный результат с помощью REGEXP
SELECT * FROM table WHERE name REGEXP 'namé';
но это не поможет, если вы попытаетесь группы именно по имени.