Ich wollte ein paar Beiträge kombinieren, um eine vollständige Antwort darauf zu erhalten, da es sich anscheinend um ein paar Schritte handelt.
- Oben Rat von @madtracey
/etc/mysql/my.cnf
oder /etc/mysql/mysql.conf.d/mysqld.cnf
[mysql]
default-character-set=utf8mb4
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
##
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Wieder von Ratschlägen vor allem hatten characterEncoding=UTF-8
und haben jdbc Verbindungen characterSetResults=UTF-8
von ihnen entfernt
Mit diesem Set -Dfile.encoding=UTF-8
schien es keinen Unterschied zu machen.
Ich konnte immer noch keinen internationalen Text in db schreiben und bekam den gleichen Fehler wie oben
Verwenden Sie nun diese Anleitung zum Konvertieren eines vollständigen MySQL-Datenbank-Zeichensatzes und einer Kollatierung in utf-8
Aktualisieren Sie Ihre gesamte Datenbank, um sie zu verwenden utf8mb4
ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Führen Sie diese Abfrage aus, die angibt, was angerufen werden muss
SELECT CONCAT(
'ALTER TABLE ', table_name, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ',
'ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ')
FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
WHERE C.collation_name = T.table_collation
AND T.table_schema = 'YOURDB'
AND
(C.CHARACTER_SET_NAME != 'utf8mb4'
OR
C.COLLATION_NAME not like 'utf8mb4%')
Kopieren Einfügen Ausgabe im Editor Ersetzen Sie alle | mit nichts Post zurück in MySQL, wenn mit korrekter Datenbank verbunden.
Das war alles was getan werden musste und alles scheint für mich zu funktionieren. Nicht das - Dfile.encoding=UTF-8
ist nicht aktiviert und es scheint wie erwartet zu funktionieren
E2A Haben Sie immer noch ein Problem?
Ich bin auf jeden Fall in der Produktion, es stellt sich also heraus, dass Sie überprüfen müssen, was oben getan wurde, da es manchmal nicht funktioniert. Hier ist Grund und Fehler in diesem Szenario:
show create table user
`password` varchar(255) CHARACTER SET latin1 NOT NULL,
`username` varchar(255) CHARACTER SET latin1 NOT NULL,
Sie können sehen, dass einige noch in Latein versuchen, den Datensatz manuell zu aktualisieren:
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
Lassen Sie es uns eingrenzen:
mysql> ALTER TABLE user change username username varchar(255) CHARACTER SET utf8mb4 not NULL;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
mysql> ALTER TABLE user change username username varchar(100) CHARACTER SET utf8mb4 not NULL;
Query OK, 5 rows affected (0.01 sec)
Kurz gesagt, ich musste die Größe dieses Felds reduzieren, damit das Update funktioniert.
Wenn ich jetzt renne:
mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
Es funktioniert alles