2013-04-29 2 views
13

Ich mache Unit Tests auf Anfragen Generatoren, und ich bekomme Probleme mit LENGTH Funktion.MySQL: seltsame LENGTH() Verhalten auf utf8 Zeichenfolge

Ich habe 2-Anfragen, die einander folgt:

SHOW VARIABLES LIKE '%character%' 

liefert folgendes Ergebnis:

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

Mein zweiter Wunsch ist:

SELECT LENGTH('重庆') as len 

Es gibt 6 statt 2

Was ist hier falsch? Mein Charset-Parameter sieht gut aus.

Antwort

24

fand ich meine Antwort in der MySQL documentation:

Die LENGTH Funktion zählt Bytes:

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

Die CHAR_LENGTH Funktion zählt Zeichen:

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

Spezifischer 'LENGTH()' gibt die Länge seines Arguments in Bytes * * während 'CHAR_LENGTH()' gibt die Länge seines Arguments in * Zeichen *. – eggyal

0

beide Sie arbeiten komplett anders:

Sobald LENGTH() gibt immer die Länge der Zeichenfolge by Bytes. CHAR_LENGTH() gibt die Länge der Zeichenfolge als Zeichen zurück.

Sobald Sie Unicode verwenden, in dem die meisten Zeichen in zwei Bytes codiert sind, wird es immer anders sein. Oder sogar wenn wir über UTF-8 sprechen, wobei die Anzahl der Bytes die ganze Zeit variiert.

z.B .:

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

Ihr Kommentar ist falsch, Unicode codiert nicht in zwei Bytes, weil es einfach keine Codierung ist. Vielleicht sprechen Sie über UTF-16. Unicode ist nur eine Spezifikation über Codepunkte. – Johnny