2013-10-11 10 views
9

In un'applicazione Rails 4.0 con Ruby 2.0, i caratteri turchi portano al seguente errore ActiveRecord/MySQL durante il tentativo di inserire un record nel database. I personaggi problematici sono ad esempio ğ e ş, ma non ci sono problemi con ü o Ç (che sembrano anche verificarsi in caratteri latini).Mysql2 :: Errore: valore di stringa errato per i caratteri turchi

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

Come si impedisce questo errore? L'applicazione e il database utilizzano UTF-8 come codifica standard. "xC4 \ x9F" è la codifica UTF-8 per "ğ", "\ xC5 \ x9F" è UTF-8 per "ş". Entrambi sembrano essere i personaggi speciali problematici. Non ci sono problemi con caratteri speciali tedeschi (äöü) o francesi (áàâ). A differenza di ISO 8859-1 o ISO 8859-15 (solo ISO 8859-9 supporta tutti i caratteri turchi) dovrebbe essere possibile memorizzare Turkish characters in UTF-8.

Le impostazioni di raccolta MySQL per il database sono le seguenti. Sarebbe utile cambiare collection_database in un valore diverso, ad esempio 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 | 
+----------------------+-------------------+ 

risposta

19

La ragione era apparentemente che il database (e in particolare le tabelle del database) hanno avuto il set di caratteri sbagliato. Passare da solo le regole di confronto del database non ha aiutato. Controllo delle tabelle del database ha mostrato che ogni tavolo aveva ancora il charset latin1, che non può memorizzare tutti i caratteri utf8:

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

Quindi ho alterato il set di caratteri della tabella direttamente:

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8; 

Poi finalmente ha funzionato, e il set di caratteri è come utf8

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

provare ad applicare force_encoding per codificare l'unicode codificato stringa turco in UTF-8 come questo prima di salvare la stringa da database.

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

this Leggi per maggiori dettagli

+0

Ma la stringa apparentemente è codificata in UTF-8? Semplicemente non può essere memorizzato nel database MySQL. – 0x4a6f4672

+0

Non penso che apparirà in questo modo (byte per byte) '\ xC4 \ x9Fu \ xC5 \ x9F' se era UTF-8, nel messaggio di errore di mysql2. Significa che mysql2 gem non ha capito come una stringa utf8. – Litmus