ฉันต้องการรวมโพสต์สองสามโพสต์เพื่อให้คำตอบแบบเต็มเนื่องจากดูเหมือนจะเป็นไม่กี่ขั้นตอน
- คำแนะนำข้างต้นโดย @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
ดูเหมือนจะไม่สร้างความแตกต่าง
ฉันยังคงไม่สามารถเขียนข้อความระหว่างประเทศลงในฐานข้อมูลได้รับความล้มเหลวเช่นเดียวกับข้างต้น
ตอนนี้ใช้วิธีการแปลง -a-- ทั้งหมด 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 เมื่อเชื่อมต่อกับฐานข้อมูลที่ถูกต้อง
นั่นคือทั้งหมดที่ต้องทำและดูเหมือนว่าทั้งหมดจะทำงานให้ฉัน ไม่ใช่ - 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
มันทำงานได้ทั้งหมด