Я хотел бы иметь возможность сделать запросы, которые нормализуют символы с диакритикой, так, чтобы, например:
é, è, and ê
все рассматриваются как 'e', в использовании запросов '=' и 'как'. Я ссорюсь с полевым набором имени пользователя к 'rené', и я хотел бы иметь возможность соответствовать на нем и 'rene' и 'rené'.
Я пытаюсь сделать это с 'сопоставлять' пунктом в 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
Я бы посоветовал вам сохранить нормализованные версии в своей таблице в дополнение к реальному имени пользователя. Изменение кодировки на лету может быть дорогостоящим, и вам придется повторно выполнять преобразование для каждой строки при каждом поиске.
Если вы используете 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."%'");
Конечно, этот метод может оказаться нежизнеспособным, если у вас есть несколько столбцов, требующих нормализации, но в вашем конкретном случае это может работать нормально .