2013-10-11 16 views
9

In einer Rails 4.0-Anwendung mit Ruby 2.0 führen türkische Zeichen zu dem folgenden ActiveRecord/MySQL-Fehler beim Versuch, einen Datensatz in der Datenbank einzufügen. Die problematischen Zeichen sind zum Beispiel »und«, aber es gibt kein Problem mit »oder« (die auch in lateinischen Zeichen vorkommen).Mysql2 :: Fehler: Falscher Zeichenfolgenwert für türkische Zeichen

ActiveRecord::StatementInvalid (Mysql2::Error: Incorrect string value: 
           '\xC4\x9Fu\xC5\x9F ...' for column ... 

Wie verhindern Sie diesen Fehler? Die Anwendung und die Datenbank verwenden UTF-8 als Standardcodierung. "xC4 \ x9F" ist UTF-8-Codierung für "ğ", "\ xC5 \ x9F" ist UTF-8 für "ş". Beide scheinen die problematischen Sonderzeichen zu sein. Es gibt kein Problem mit deutschen (äöü) oder französischen (áàâ) Sonderzeichen. Im Gegensatz zu ISO 8859-1 oder ISO 8859-15 (nur ISO 8859-9 unterstützt alle türkischen Zeichen) sollte es möglich sein, Turkish characters in UTF-8 zu speichern.

Die MySQL-Sammlungseinstellungen für die Datenbank lauten wie folgt. Wäre es hilfreich, den Wert collection_database auf einen anderen Wert zu setzen, z. B. utf8_unicode_ci?

mysql> show variables like '%collation%'; 
+----------------------+-------------------+ 
| Variable_name  | Value    | 
+----------------------+-------------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | latin1_swedish_ci | 
| collation_server  | latin1_swedish_ci | 
+----------------------+-------------------+ 

Antwort

19

Der Grund, dass die Datenbank (und vor allem die Datenbanktabellen) den falschen Zeichensatz hatte. Die Umstellung der Datenbank allein hat nicht geholfen. Inspektion der Datenbanktabellen zeigten, dass jede Tabelle noch die latin1 charset hatte, die nicht alle UTF-8-Zeichen speichern kann:

mysql> show table status; 
+----------+--------+-------------------+ .. 
| Name  | Engine | Collation   | .. 
+----------+--------+-------------------+ .. 
| my_table | InnoDB | latin1_swedish_ci | .. 

Darum habe ich den Zeichensatz der Tabelle direkt geändert: es

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8; 

Dann endlich funktioniert, und der Zeichensatz ist wie utf8

mysql> show table status; 
    ... +-------------------+ .. 
    ... | Collation   | .. 
    ... +-------------------+ .. 
    ....| utf8_general_ci | .. 
0

Versuchen force_encoding Anwendung Ihr Unicode-türkisches String in UTF-8, wie diese codiert zu kodieren, bevor die Zeichenfolge Datenbank zu speichern.

turkish_string = turkish_string.force_encoding("UTF-8") 

lesen this für weitere Details war offenbar

+0

Aber die Zeichenfolge ist offenbar in UTF-8 codiert? Es kann einfach nicht in der MySQL-Datenbank gespeichert werden. – 0x4a6f4672

+0

Ich glaube nicht, dass es so aussehen wird (Byte für Byte) '\ xC4 \ x9Fu \ xC5 \ x9F' wenn es UTF-8 war, in der Fehlermeldung von mysql2. Es bedeutet, dass mysql2 gem es nicht als utf8-String bekommen hat. – Litmus