2013-04-29 54 views
13

我正在做请求生成器的单元测试,并且遇到了LENGTH函数的麻烦。MySQL:utf8字符串上的奇怪LENGTH()行为

我有2个请求遵循相互:

SHOW VARIABLES LIKE '%character%' 

返回以下结果:

array(8) { 
    [0] => 
    array(2) { 
    'Variable_name' => 
    string(20) "character_set_client" 
    'Value' => 
    string(4) "utf8" 
    } 
    [1] => 
    array(2) { 
    'Variable_name' => 
    string(24) "character_set_connection" 
    'Value' => 
    string(4) "utf8" 
    } 
    [2] => 
    array(2) { 
    'Variable_name' => 
    string(22) "character_set_database" 
    'Value' => 
    string(6) "latin1" 
    } 
    [3] => 
    array(2) { 
    'Variable_name' => 
    string(24) "character_set_filesystem" 
    'Value' => 
    string(6) "binary" 
    } 
    [4] => 
    array(2) { 
    'Variable_name' => 
    string(21) "character_set_results" 
    'Value' => 
    string(4) "utf8" 
    } 
    [5] => 
    array(2) { 
    'Variable_name' => 
    string(20) "character_set_server" 
    'Value' => 
    string(4) "utf8" 
    } 
    [6] => 
    array(2) { 
    'Variable_name' => 
    string(20) "character_set_system" 
    'Value' => 
    string(4) "utf8" 
    } 
    [7] => 
    array(2) { 
    'Variable_name' => 
    string(18) "character_sets_dir" 
    'Value' => 
    string(26) "/usr/share/mysql/charsets/" 
    } 
} 

我的第二个要求是:

SELECT LENGTH('重庆') as len 

它返回6代替2- 。

这里有什么问题?我的字符集参数看起来不错。

回答

24

我发现我在MySQL documentation答案:

LENGTH函数计算字节

mysql> SELECT LENGTH('重庆') ; 
+------------------+ 
| LENGTH('重庆') | 
+------------------+ 
|    6 | 
+------------------+ 
1 row in set (0.00 sec) 

CHAR_LENGTH函数计算字符

mysql> SELECT CHAR_LENGTH('重庆') ; 
+-----------------------+ 
| CHAR_LENGTH('重庆') | 
+-----------------------+ 
|      2 | 
+-----------------------+ 
1 row in set (0.00 sec) 
+2

更具体地,'LENGTH()'返回*字节×而'CHAR_LENGTH()'返回其自变量的在字符*长度*其参数的长度。 – eggyal 2013-04-29 12:44:01

0

他们都完全正常工作不同的:

一旦LENGTH()总是以字节返回字符串的长度。 CHAR_LENGTH()会返回字符串的长度。

一旦你使用的Unicode,其中大多数字符是在两个字节编码,它总是会不同。甚至当我们谈论UTF-8时,字节数一直在变化。

例如为:

SELECT LENGTH('重庆'), CHAR_LENGTH('重庆'); 
--> 6, 2 
+0

您的评论是错误的,Unicode不会编码两个字节,因为它根本不是一种编码。也许你在谈论UTF-16。 Unicode只是一个关于代码点的规范。 – Johnny 2017-09-24 13:12:35