19

我正在对请求生成器进行单元测试,但遇到了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。

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

4

2 回答 2

46

我在MySQL 文档中找到了答案:

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)
于 2013-04-29T12:41:26.933 回答
2

它们的工作方式完全不同:

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

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

例如:

SELECT LENGTH('重庆'), CHAR_LENGTH('重庆');
-->   6,  2  
于 2013-04-29T12:54:46.873 回答