Quería combinar un par de publicaciones para obtener una respuesta completa de esto, ya que parece ser unos pocos pasos.
- Por encima del consejo de @madtracey
/etc/mysql/my.cnf
o /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
Nuevamente, por consejo sobre todas las conexiones jdbc tenían characterEncoding=UTF-8
y se characterSetResults=UTF-8
eliminaron de ellas
Con este conjunto -Dfile.encoding=UTF-8
parecía no hacer la diferencia.
Todavía no podía escribir texto internacional en db obteniendo el mismo error que el anterior
Ahora usando este cómo-convertir-un-todo-mysql-database-characterset-and-collation-to-utf-8
Actualiza todos tus db para usar utf8mb4
ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Ejecute esta consulta que le brinda lo que necesita sonar
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%')
Copiar pegar salida en editor reemplazar todo | sin nada publicado nuevamente en mysql cuando está conectado a la base de datos correcta.
Eso es todo lo que tenía que hacer y todo parece funcionar para mí. No el - Dfile.encoding=UTF-8
no está habilitado y parece funcionar como se esperaba
E2A ¿Sigue teniendo problemas?
Ciertamente estoy en producción, así que resulta que debes verificar lo que se hizo anteriormente, ya que a veces no funciona, aquí hay una razón y una solución en este escenario:
show create table user
`password` varchar(255) CHARACTER SET latin1 NOT NULL,
`username` varchar(255) CHARACTER SET latin1 NOT NULL,
Puede ver que algunos todavía son latinos intentando actualizar manualmente el registro:
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
Así que vamos a reducirlo:
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 resumen, tuve que reducir el tamaño de ese campo para que la actualización funcionara.
Ahora cuando corro:
mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
Todo funciona