нормализация символов с диакритикой в запросах MySQL

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

é, è, 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
16
задан George Armhold 20 February 2010 в 16:24
поделиться

1 ответ

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

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

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

7
ответ дан 30 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: