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 |
+----------------------+-------------------+
Ma la stringa apparentemente è codificata in UTF-8? Semplicemente non può essere memorizzato nel database MySQL. – 0x4a6f4672
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