Je voulais combiner quelques articles pour répondre pleinement à cela, car cela semble être quelques étapes.
- Ci-dessus les conseils de @madtracey
/etc/mysql/my.cnf
ou /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
Encore une fois à partir des conseils avant tout, les connexions jdbc avaient characterEncoding=UTF-8
etcharacterSetResults=UTF-8
retirés de leur
Avec cet ensemble -Dfile.encoding=UTF-8
semblait ne faire aucune différence.
Je ne pouvais toujours pas écrire de texte international en db obtenant le même échec que ci-dessus
Maintenant, en utilisant ce comment-convertir-un-ensemble-de-caractères-de-base-de-données-mysql-et-collation-en-utf-8
Mettez à jour tous vos db pour les utiliser utf8mb4
ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Exécutez cette requête qui vous donne ce qui doit être appelé
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%')
Copier coller la sortie dans l'éditeur remplacer tout | sans rien poster dans mysql lorsqu'il est connecté pour corriger la base de données.
C'est tout ce qui devait être fait et tout semble fonctionner pour moi. Pas le -Dfile.encoding=UTF-8
n'est pas activé et il semble fonctionner comme prévu
E2A Vous rencontrez toujours un problème?
Je suis certainement en production, il s'avère que vous devez vérifier ce qui a été fait ci-dessus, car cela ne fonctionne parfois pas, voici la raison et la solution dans ce scénario:
show create table user
`password` varchar(255) CHARACTER SET latin1 NOT NULL,
`username` varchar(255) CHARACTER SET latin1 NOT NULL,
Vous pouvez voir que certains sont encore en train d'essayer de mettre à jour manuellement l'enregistrement:
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
Alors, rétrécissons-le:
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)
En bref, j'ai dû réduire la taille de ce champ pour que la mise à jour fonctionne.
Maintenant, quand je cours:
mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
Tout fonctionne