我正在对请求生成器进行单元测试,我遇到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。
这里有什么问题?我的charset参数看起来不错。
答案 0 :(得分:36)
我在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)
答案 1 :(得分:1)
他们都完全不同:
一旦LENGTH()总是返回字符串的长度。 CHAR_LENGTH()将按字符返回字符串的长度。
一旦你使用Unicode,其中大多数字符以两个字节编码,它总是会有所不同。或者甚至当我们谈论UTF-8时,字节数始终在变化。
e.g:
SELECT LENGTH('重庆'), CHAR_LENGTH('重庆');
--> 6, 2