MySQL:char_length(),俄语的错误值

时间:2011-08-17 17:13:20

标签: mysql double-byte

我正在使用char_length()来衡量“Русский”的大小:奇怪的是,它不是告诉我它是7个字符,它告诉我有14个。有趣的是,如果查询只是......

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

......答案是对的。但是,如果我查询数据库,则anser为14:

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

任何人都有任何想法我可能做错了什么?我可以确认排序规则是utf8_general_ci,表格是MyISAM

谢谢, 阿德里安

编辑:我的最终目标是能够测量包含单字节和双字节字符的表中的记录长度(例如,英语和俄语,但不仅限于这两种语言)

2 个答案:

答案 0 :(得分:2)

因为每个UTF8 char使用两个字节。 见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

我已经测试过:set name koi8r;创建表等,得到无效的结果。 所以解决方案是重新创建表并在设置集名称UTF8后插入所有数据。

答案 1 :(得分:1)

该函数返回它是由最相邻的charset avaiable
指导的anwser 在列的情况下,列定义为 在文字的情况下,连接默认为
查看列charset:

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

要小心,它不会被table_schema过滤