Я хотів об'єднати пару публікацій, щоб отримати повну відповідь на це, оскільки, здається, це кілька кроків.
- Вище поради від @madtracey
/etc/mysql/my.cnf
або /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
Знову ж із порад, перш за все, jdbc-з'єднань було characterEncoding=UTF-8
і characterSetResults=UTF-8
видалено з них
З цим набором -Dfile.encoding=UTF-8
не було значення.
Я все ще не міг записати міжнародний текст у db, отримуючи такий самий збій, як вище
Тепер за допомогою цього способу перетворення-на-ціле-mysql-бази даних-набору символів-і-зіставлення-до-utf-8
Оновіть всі свої db для використання utf8mb4
ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Запустіть цей запит, який дає вам те, що потрібно передзвонити
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%')
Скопіюйте вихід пасти в редактор замініть всі | без нічого відправити повідомлення в mysql, коли він підключений до виправлення db.
Це все, що довелося зробити, і все, здається, працює на мене. Не - Dfile.encoding=UTF-8
- не ввімкнено, і, здається, працює як очікувалося
У E2A все ще виникає проблема?
Я, звичайно, перебуваю на виробництві, тож виявляється, що вам потрібно перевірити, що було зроблено вище, оскільки це іноді не працює, ось причина і виправлення в цьому сценарії:
show create table user
`password` varchar(255) CHARACTER SET latin1 NOT NULL,
`username` varchar(255) CHARACTER SET latin1 NOT NULL,
Ви можете бачити, що деякі з латині намагаються оновити запис вручну:
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
Тож давайте звузимо це:
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)
Коротше кажучи, мені довелося зменшити розмір цього поля, щоб заставити оновлення працювати.
Тепер, коли я бігаю:
mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
Це все працює