2

我正在使用 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

谢谢,阿德里安

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

4

2 回答 2

2

因为每个 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

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

于 2011-08-17T17:35:42.780 回答
1

该函数返回它的 anwser,由列的情况下可用的最相邻的字符集引导,在文字的情况下为
列定义
,连接默认
检查列字符集:

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

小心,它没有被 table_schema 过滤

于 2011-08-17T18:13:00.457 回答