MySQL: char_length(), неправильное значение для русского языка

Я использую char_length() для измерения размера "Русский": как ни странно, вместо того, чтобы сказать мне, что это 7 символов, он говорит, что их 14. Интересно, если запрос просто...

SELECT CHAR_LENGTH('Русский')

... ответ правильный. Однако, если я вместо этого запрашиваю DB, anser будет 14:

SELECT CHAR_LENGTH(text) FROM locales WHERE lang = 'ru-RU' AND name = 'lang_name'

У кого-нибудь есть идеи, что я могу делать не так? Я могу подтвердить, что параметры сортировки - utf8_general_ci, а таблица - MyISAM.

Спасибо Адриен

РЕДАКТИРОВАТЬ: Моя конечная цель состоит в том, чтобы иметь возможность измерять длины записей в таблице, содержащей одно- и двухбайтовые символы (например, английский и русский, но не ограничиваясь только этими двумя языками)

2 ответа

Решение

Из-за двух байтов используется для каждого символа UTF8. См. http://dev.mysql.com/doc/refman/5.5/en/string-functions.html

mysql> set names utf8;
mysql> SELECT CHAR_LENGTH('Русский'); result - 7
mysql> SELECT CHAR_LENGTH('test'); result  - 4

create table test123 (
text VARCHAR(255) NOT NULL DEFAULT '',
text_text TEXT) Engine=Innodb default charset=UTF8;

insert into test123 VALUES('русский','test русский');

SELECT CHAR_LENGTH(text),CHAR_LENGTH(text_text) from test123; result - 7 and 12

Я проверил работу с: установить имена koi8r; создать таблицу и т. д. и получить недопустимый результат. Таким образом, решение заключается в воссоздании таблицы и вставке всех данных после установки набора имен UTF8.

Функция возвращает свой ответ, руководствуясь самой доступной кодировкой
в случае столбца определение столбца
в случае литерала соединение по умолчанию
просмотрите кодировку столбца с помощью:

SELECT CHARACTER_SET_NAME FROM information_schema.`COLUMNS` 
where table_name = 'locales'
and column_name = 'text'

будьте осторожны, он не фильтруется таблицей_схемы

Другие вопросы по тегам