Intereting Posts
Группа MySQL и брекетинг в зависимости от возраста Сократить таблицу в Oracle, получив ошибки MySQL Несколько соединений в одном запросе? Как мне обновить, если существует, вставить, если нет (AKA «upsert» или «merge») в MySQL? LOAD DATA из файла CSV, где в качестве escape-символа используется doublequote SQL Select Внутреннее соединение по одному Как продолжить цикл while после исключения в SQL Postgres "Отсутствует запись FROM-clause" при запросе с предложением WITH Удалите несколько выбранных записей из многосетевого списка (Access) Использование динамического SQL для указания имени столбца путем добавления переменной к простому sql-запросу Сообщения о заказе MySQL по последнему комментарию или последнему сообщению Алгоритм вычисления наиболее стабильных последовательных значений из базы данных Неверный синтаксис рядом с '<'. Метка «xmlns» уже объявлена. Названия ярлыков должны быть уникальными в рамках пакета запросов или хранимой процедуры Есть ли способ сделать этот SQL более эффективным? SQL Server 2005 «обновление из» запроса

нормализация акцентированных символов в MySQL-запросах

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

é, è, 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 

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

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

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

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

 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) 

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

 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 привел меня сюда по соответствующему вопросу, я, хотя он все еще заслуживает ответа 🙂

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

Если вы используете 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."%'"); 

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

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

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

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

или для удаления некоторых символов

 SELECT tr(name, 'áäèëî', null) FROM persons 
 $normalized = iconv('UTF-8', 'ASCII//TRANSLIT', $string); 

является идеальным решением php, но в mysql? КОНВЕРТИРОВАТЬ?

в mysql

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

Производить:

 Álvaro José ?lvaro Jos? 

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

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

Не любое решение.