Tôi muốn kết hợp một vài bài viết để đưa ra câu trả lời đầy đủ về điều này vì nó dường như là một vài bước.
- Lời khuyên trên của @madtracey
/etc/mysql/my.cnf
hoặc là /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
Một lần nữa từ lời khuyên trên tất cả các kết nối jdbc đã có characterEncoding=UTF-8
và characterSetResults=UTF-8
xóa khỏi chúng
Với bộ này -Dfile.encoding=UTF-8
xuất hiện để không có sự khác biệt.
Tôi vẫn không thể viết văn bản quốc tế vào db bị lỗi như trên
Bây giờ bằng cách sử dụng cách chuyển đổi-an-toàn bộ-mysql-cơ sở dữ liệu-ký tự-và-đối chiếu-thành-utf-8 này
Cập nhật tất cả db của bạn để sử dụng utf8mb4
ALTER DATABASE YOURDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Chạy truy vấn này cung cấp cho bạn những gì cần được rung
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%')
Sao chép đầu ra dán trong trình chỉnh sửa thay thế tất cả | không có gì đăng lại vào mysql khi được kết nối với db chính xác.
Đó là tất cả những gì phải làm và tất cả dường như làm việc cho tôi. Không phải - Dfile.encoding=UTF-8
không được bật và có vẻ như hoạt động như mong đợi
E2A Vẫn có vấn đề?
Tôi chắc chắn đang trong quá trình sản xuất nên hóa ra bạn cần phải kiểm tra những gì đã được thực hiện ở trên, vì đôi khi nó không hoạt động, đây là lý do và cách khắc phục trong kịch bản này:
show create table user
`password` varchar(255) CHARACTER SET latin1 NOT NULL,
`username` varchar(255) CHARACTER SET latin1 NOT NULL,
Bạn có thể thấy một số người vẫn đang cố gắng cập nhật bản ghi theo cách thủ công:
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
Vì vậy, hãy thu hẹp nó xuống:
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)
Nói tóm lại, tôi phải giảm kích thước của trường đó để cập nhật hoạt động.
Bây giờ khi tôi chạy:
mysql> ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
Tất cả đều hoạt động