нормализация акцентированных символов в запросах MySQL - PullRequest
16 голосов
/ 20 февраля 2010

Я бы хотел иметь возможность выполнять запросы, которые нормализуют символы с акцентом, например:

é, è, and ê

все обрабатываются как 'e', ​​в запросах, использующих '=' и 'like'. У меня есть строка с полем имени пользователя, установленным на ' rené ', и я хотел бы иметь возможность сопоставлять ее с ' rene ' и ' rené ».

Я пытаюсь сделать это с помощью условия 'collate' в MySQL 5.0.8. Я получаю следующую ошибку:

mysql> select * from User where username = 'rené' collate utf8_general_ci;
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

FWIW, моя таблица была создана с:

CREATE TABLE `User` (
  `id` bigint(19) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `uniqueUsername` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=56790 DEFAULT CHARSET=utf8

Ответы [ 4 ]

9 голосов
/ 03 июня 2013

Причиной ошибки является не таблица, а набор символов вашего ввода, то есть «rené» в вашем запросе. Поведение зависит от переменной character_set_connection :

Набор символов, используемый для литералов, которые не имеют вводного набора символов, и для преобразования числа в строку.

Используя MySQL Client, измените его, используя SET NAMES:

Оператор SET NAMES 'charset_name' эквивалентен этим трем операторам:

SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;

(из http://dev.mysql.com/doc/refman/5.5/en/charset-connection.html)

Пример вывода:

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from User where username = 'rené' collate utf8_general_ci;
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from User where username = 'rené' collate utf8_general_ci;
Empty set (0.00 sec)

В качестве альтернативы, use может явно задавать набор символов с помощью «вводчика набора символов»:

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from User where username = _utf8'rené' collate utf8_general_ci;
Empty set (0.00 sec)

Я знаю, что этот вопрос довольно старый, но так как Google привел меня сюда для смежного вопроса, я все же заслуживаю ответа :)

7 голосов
/ 20 февраля 2010

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

Если вы используете PHP, вы можете использовать iconv () для обработки преобразования:

$username = 'rené';
$normalized = iconv('UTF-8', 'ASCII//TRANSLIT', $string);

Тогда вы просто сохраните обе версии и будете использовать нормализованную версию для поиска и обычное имя пользователя для отображения. Сравнение и выбор будет намного быстрее из нормализованного столбца, при условии, что вы также нормализуете строку поиска:

$search = mysql_real_escape_string(iconv('UTF-8', 'ASCII//TRANSLIT', $_GET['search']));
mysql_query("SELECT * FROM User WHERE normalized LIKE '%".$search."%'");

Конечно, этот метод может оказаться неэффективным, если у вас есть несколько столбцов, которые нуждаются в нормализации, но в вашем конкретном случае это может сработать нормально.

5 голосов
/ 23 октября 2012

Я реализовал функцию strtr php / tr unix в MySQL, вы можете получить исходный код здесь

Вы можете использовать как:

SELECT tr(name, 'áäèëî', 'aaeei') FROM persons

или лишить некоторых символов

SELECT tr(name, 'áäèëî', null) FROM persons
3 голосов
/ 20 мая 2011
$normalized = iconv('UTF-8', 'ASCII//TRANSLIT', $string);

это идеальное решение PHP, но в MySQL? CONVERT

в mysql

SELECT 'Álvaro José' as accented, (CONVERT ('Álvaro José' USING ascii)) as notaccented

Produce:

Álvaro José     ?lvaro Jos?

Акцентированные слова не преобразуются в акцентированные слова, это не эквивалентно транслиту iconv.

RegExp не работает с UTF-8.

Нет решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...