MySQL: char_length (), неправильное значение для русского языка - PullRequest
1 голос
/ 17 августа 2011

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

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

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.

1 голос
/ 17 августа 2011

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

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

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

...