ตั้งค่า character_set_client เป็น utf8mb4


12

ฉันพยายามแปลงฐานข้อมูลของฉันให้เป็นutf8mb4ไปตามคู่มือนี้ ฉันได้ตั้ง:

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
skip-character-set-client-handshake

แต่คุณค่าของcharacter_set_clientและcharacter_set_resultsยังคงไม่เปลี่ยนเป็น utf8mb4

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8               |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8               |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

ผมทำอะไรผิดหรือเปล่า? ฉันจะตั้งค่าเหล่านั้นเป็น utf8mb4 ได้อย่างไร

คำตอบ:


14

การเปิดเผยข้อมูล:ฉันเป็นผู้เขียนวิธีการสนับสนุน Unicode แบบเต็มในฐานข้อมูล MySQLคู่มือที่คุณกำลังติดตาม

  1. คุณบันทึกการตั้งค่าที่แก้ไขไว้ที่ไหน ตรวจสอบว่าmysqldโหลดตัวเลือกเริ่มต้นจากที่ใด มักจะเป็น/etc/my.cnf ( ดังที่กล่าวไว้ในคำแนะนำ ) แต่มันอาจแตกต่างกันในระบบของคุณ รันคำสั่งต่อไปนี้เพื่อค้นหา:

    $ mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'
    Default options are read from the following files in the given order:
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
  2. คุณเริ่มต้นใหม่mysqldด้วยการรันmysqld restartหลังจากทำการเปลี่ยนแปลงหรือไม่?


1. \xampp\mysql\bin\my.iniการเปลี่ยนแปลงที่ถูกบันทึกไว้ใน ฉันไม่สามารถทำงานได้mysqld --help --verbose 2> /dev/null | grep -A1 'Default options'- เนื่องจากมีข้อผิดพลาดต่อไปนี้: 'grep' is not recognized as an internal or external command, operable program or batch file.ฉันยังใหม่กับสิ่งนี้ดังนั้นฉันอาจทำสิ่งผิดปกติ
qwaz

2. ฉันทำการรีสตาร์ท mysqld และหลังจากนั้นก็ให้คำเตือนต่อไปนี้: 2014-02-19 10:25:17 0 [คำเตือน] การใช้ตัวเลือกคำนำหน้าตัวเลือกที่ไม่ซ้ำกัน character_set_client แทนตัวอักษร set-client-handshake จะเลิกใช้แล้ว ในการเปิดตัวในอนาคต โปรดใช้ชื่อเต็มแทน 2014-02-19 10:25:17 0 [คำเตือน] mysqld: ไม่สนใจตัวเลือก '--character-set-client-handshake' เนื่องจากค่าไม่ถูกต้อง 'utf8mb4'
qwaz

1
ทำไมคุณถึงมีskip-character-set-client-handshakeไฟล์ config ของคุณ? มันเป็นตัวเลือกบรรทัดคำสั่งไม่ใช่ตัวแปร
Mathias Bynens

1
ฉันต้องติดตั้งเซิร์ฟเวอร์ภายในเครื่องอีกครั้ง เดินผ่านไกด์ของคุณอีกครั้งและทุกอย่างก็เรียบร้อย ฉันขอขอบคุณคำตอบและความช่วยเหลือของคุณ ฉันจะกลับมาที่คำตอบของคุณและโหวตขึ้นทันทีที่ฉันมีจำนวนพนักงานเพียงพอที่จะทำเช่นนั้น
qwaz

3
ฉันพยายามนี้ แต่ยังคงcharacter_set_client, character_set_connection, character_set_results, จะแสดงเป็นcollation_connection utf8ความคิดเห็นใด ๆ ที่ทำให้สิ่งนี้ไม่ทำงาน
Sarita

2

ฉันได้ทำตามคำแนะนำนั้นแล้วอย่างไรก็ตามปัญหาเดียวกันก็ปรากฏขึ้นอีกครั้ง ปัญหาที่เกิดขึ้นจริงในการโกหกคำสั่งที่ใช้ในการสร้างฐานข้อมูลก็จะเป็นอาร์กิวเมนต์และหากที่ไม่ผ่านการดำเนินการในขณะที่ชุดตัวอักษรเริ่มต้นจะถูกส่งผ่านซึ่งไม่ได้เป็นDEFAULT CHARACTERutfmb4

ด้านล่างเป็นขั้นตอนที่ฉันทำตามเพื่อแก้ไข:

  1. สร้างฐานข้อมูลจำลองด้วยutf8mb4ชุดอักขระ

    create database `your_db_name_dummy`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  2. คัดลอกโครงสร้างและข้อมูลจริงไปยังฐานข้อมูลจำลองจากฐานข้อมูลจริง

    mysqldump -uroot -proot_password your_db_name | mysql -uroot -proot_password your_db_name_dummy

  3. วางฐานข้อมูลปัจจุบัน

    SET FOREIGN_KEY_CHECKS=0;
    DROP DATABASE your_db_name;
  4. สร้างฐานข้อมูลใหม่

    create database `your_db_name`
      DEFAULT CHARACTER SET utf8mb4
      DEFAULT COLLATE utf8mb4_unicode_ci;
  5. ในที่สุดให้วางโครงสร้างตารางและข้อมูลกลับไปที่ฐานข้อมูลต้นฉบับ

    mysqldump -uroot -proot_password your_db_name_dummy | mysql -uroot -proot_password your_db_name

หากคุณกำลังจะใช้ขั้นตอนดังกล่าวข้างต้นโปรดตรวจสอบให้แน่ใจว่าได้อ่านบรรทัดด้านล่างอย่างระมัดระวังด้วย

ข้อกำหนดเบื้องต้นและสถานะปัจจุบันของฉัน:

  • สำรองโครงสร้างข้อมูลขั้นตอนการจัดเก็บฟังก์ชั่นทริกเกอร์ ฯลฯ
  • mysql --version mysql Ver 14.14 Distrib 5.7.22, สำหรับ Linux (x86_64) โดยใช้ EditLine wrapper

  • cat /etc/my.cnf

    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    init-connect = 'SET NAMES utf8mb4
    collation-server = utf8mb4_unicode_ci
  • ฉันใช้ไคลเอนต์ java ซึ่งก็คือ 'mysql:mysql-connector-java:5.1.30'

  • สตริงการเชื่อมต่อของฉันคือ jdbc:mysql://ip.of.database:3306/your_db_name?zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&autoReconnect=true
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.