у меня есть таблица в моей базе данных, похожая на эту
id | name | email
-----------------------------------------
1 | elie | [email protected]
2 | jénifer | [email protected]
3 | jenny | [email protected]
как вы видите запись с ID = 2 имеет в названии французский символ. при запуске этого SQL
SELECT * FROM `TABLENAME` WHERE `name` LIKE '%jé%'
Я ожидаю увидеть только запись с ID = 2. Вместо этого я получаю ID = 2 & ID = 3. SQL заменяет французский символ «é» на «e».
Моя база данных, таблица и поля имеют Collation = utf8_general_ci
Что я должен сделать в этом случае, чтобы получить правильный результат, если мне нужно сохранить французские символы, сохраненные в моей базе данных?
Используйте для этого REGEXP
SELECT * FROM `TABLENAME` WHERE `name` REGEXP '.*é.*'
LIKE игнорирует диакритические знаки, а REGEXP — нет.
Я обнаружил, что его известная ошибка в MySQL 5.1
[1 ноября 2010 8:52] Питер Лаурсен
Таким образом, вы можете создать таблицу, как это
CREATE TABLE test (
id INT AUTO_INCREMENT,
vers TEXT,
PRIMARY KEY (id)
) CHARACTER SET utf8 COLLATE utf8_danish_ci;
или это
CREATE TABLE `test` (
`id` INT (11) NOT NULL AUTO_INCREMENT,
`vers` TEXT CHARACTER SET utf8 COLLATE utf8_danish_ci,
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
или же
написать запросы с предложением (ями) COLLATE, как описано здесь:
http://dev.mysql.com/doc/refman/5.0/en/charset-collate.html
Обратите внимание, что оператор LIKE не поддерживает COLLATE. Он выполняется, но игнорируется.
SELECT 'a' LIKE 'å' COLLATE utf8_danish_ci; -- '0'
(то, что я думаю, я сообщу как ошибку самостоятельно или по крайней мере, запрос документа)