MySQL сопоставляет символы юникода с версией ascii - PullRequest
10 голосов
/ 02 июля 2011

Я использую 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 сопоставляет символы Юникода с версиями 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 ]

12 голосов
/ 07 июля 2011

Вы указали столбец name как text CHARACTER SET utf8 COLLATE utf8_unicode_ci, который говорит MySQL, что при сопоставлении и сортировке следует учитывать e и é .Это сопоставление и utf8_general_ci делают многое эквивалентным.

http://www.collation -charts.org / - отличный ресурс, когда вы научитесь читать диаграммы, что довольнолегко.

Если вы хотите, чтобы e и é и т. д. считались различными, то вы должны выбрать другое сопоставление.Чтобы выяснить, какие параметры сортировки находятся на вашем сервере (при условии, что вы ограничены кодировкой UTF-8):

mysql> show collation like 'utf8%';

И выберите использование таблиц сопоставления в качестве справочного.

Еще один особыйСортировка utf8_bin, в которой нет эквивалентов, это двоичное совпадение.

Единственные сопоставления MySQL Unicode, о которых я знаю, которые не зависят от языка, это 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 |
+-------+

Еще один полезный трюксостоит в том, чтобы заполнить таблицу из одного столбца набором символов, которые вас интересуют (это проще из скрипта), а затем 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,ä,á           |
+-----------------+
5 голосов
/ 09 октября 2013

Конечно, это будет работать:

SELECT * FROM table WHERE name LIKE BINARY 'namé';
2 голосов
/ 02 января 2012

одна вещь, которую вы можете сделать со своей строкой запроса, - это декодировать ее ...

< ?php
$query="उनकी"; // some Unicode characters
$query=urldecode($query);
$qry= "SELECT * FROM table WHERE books LIKE '%$query%'";

//rest of the code....
?>

это сработало для меня.:)

1 голос
/ 02 июля 2011

Вы установили параметры сортировки на utf8_unicode_ci, что соответствует латинским символам с ударением. Дополнительную информацию можно найти здесь .

0 голосов
/ 07 февраля 2013

Я узнал, что вы получаете запрошенный результат, используя REGEXP

SELECT * FROM table WHERE name REGEXP 'namé';

Но это не поможет, если вы попытаетесь сгруппировать в точности по имени.

...