2010-11-10 2 views
1

У меня есть функция поиска, я хочу, чтобы это было чувствительно к регистру, в том числе символы, такие как EuO т.д.MySQL UPPER() и LOWER() не работает с UTF-8 символов

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

SELECT * FROM items WHERE UPPER(description) = $input 

У меня есть MySQL 5.1.32, я пробовал разные сортировки, но ни один из них не работает правильно. То же самое с LOWER().

CREATE TABLE `items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    `description` text CHARACTER SET utf8 COLLATE utf8_bin, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=187 DEFAULT CHARSET=utf8" 

Поле описания содержит 'hellö'. Mysql преобразует его в «HELLö». Я хочу «ЭТО ...».

+1

Пожалуйста вывесить выход 'SHOW CREATE TABLE' деталей, значение '$ input' и значение' name' вы ожидаете, чтобы соответствовать. – Quassnoi

+0

Сделано! (также изменил его в поле описания вместо имени) –

+0

вы используете 'UTF8_BIN', который чувствителен к случаю и акценту. Вместо этого используйте 'UTF8_GENERAL_CI'. – Quassnoi

ответ

1

Это работает для меня:

CREATE TABLE items (id INT NOT NULL, name VARCHAR(100) COLLATE UTF8_GENERAL_CI) ENGINE=InnoDB; 

INSERT 
INTO items 
VALUES (1, 'Eyjafjallajökull'); 

SELECT * 
FROM items 
WHERE name = 'EYJAFJALLAJOKULL'; 

-- 
1  Eyjafjallajökull 

SELECT UPPER('Eyjafjallajökull') 
FROM items; 

-- 
EYJAFJALLAJÖKULL 
+0

Но это не его смысл. Если я правильно его понимаю, его проблема в том, что 'UPPER (« Eyjafjallajökull »)' возвращает 'EYJAFJALLAJOKULL' –

+0

Но, с другой стороны, это, конечно, исправляет его первоначальное требование, так что +1 :) –

+0

Странно, это работает и для меня. Также с MyISAM вместо InnoDB. Я не понимаю разницы. –

Смежные вопросы