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/"
  }
}

私の2番目のリクエストは次のとおりです。

SELECT LENGTH('重庆') as len

2 ではなく 6 を返します。

ここで何が問題なのですか? 私の文字セットパラメータは良さそうです。

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() は、文字列の長さを文字単位で返します。

ほとんどの文字が 2 バイトでエンコードされている Unicode を使用すると、常に異なるものになります。または、バイト数が常に変化する UTF-8 について話している場合でも。

例えば:

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