เปลี่ยนชุดอักขระเริ่มต้นของ MySQL เป็น UTF-8 ใน my.cnf หรือไม่


334

ขณะนี้เรากำลังใช้คำสั่งต่อไปนี้ใน PHP เพื่อตั้งค่าชุดอักขระเป็นUTF-8ในแอปพลิเคชันของเรา

เนื่องจากนี่เป็นค่าใช้จ่ายเล็กน้อยเราจึงต้องการตั้งค่านี้เป็นค่าเริ่มต้นใน MySQL เราสามารถทำได้ใน /etc/my.cnf หรือในสถานที่อื่นได้หรือไม่?

SET NAMES 'utf8'
SET CHARACTER SET utf8

ฉันค้นหาชุดอักขระเริ่มต้นใน /etc/my.cnf แต่ไม่มีอะไรเกี่ยวกับชุดอักขระ

ณ จุดนี้ฉันทำต่อไปนี้เพื่อตั้งค่า MySQL charset และ collation variables เป็น UTF-8:

skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8

นั่นเป็นวิธีที่ถูกต้องในการจัดการกับสิ่งนี้หรือไม่?


19
โปรดทราบว่าค่าเริ่มต้นที่ดีกว่าutf8mb4คือ UTF-8 ที่แท้จริงพร้อมการสนับสนุน Unicode แบบเต็ม ดูวิธีการสนับสนุนเต็มรูปแบบ Unicode ในฐานข้อมูล
Mathias Bynens

@Jorre คุณต้องการที่จะเปลี่ยนแปลงสิ่งนี้เป็นแบบutf8mb4นี้การตั้งค่าแบบอย่างที่เป็นอันตรายในขณะที่มันนั่ง?
Evan Carroll

คำตอบ:


424

หากต้องการตั้งค่าเริ่มต้นเป็น UTF-8 คุณต้องการเพิ่มสิ่งต่อไปนี้ใน my.cnf

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

หากคุณต้องการเปลี่ยนชุดอักขระสำหรับฐานข้อมูลที่มีอยู่โปรดแจ้งให้เราทราบ ... คำถามของคุณไม่ได้ระบุไว้โดยตรงดังนั้นฉันไม่แน่ใจว่าเป็นสิ่งที่คุณต้องการทำหรือไม่


18
การตั้งค่า my.cnf ด้านบนใช้ได้สำหรับฉันเช่นกัน นอกจากนี้ฉันต้องตรวจสอบให้แน่ใจว่าตารางนั้นถูกตั้งค่าอย่างถูกต้องเช่น ALTER TABLE TableCONVERT ไปยัง CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Chris Livdahl

8
ไม่ทำงานสำหรับ mysql 5.5 ฉันใช้: <br/> [mysqld] # การเปลี่ยนแปลงสำหรับ utf-8 collation-server = utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4' character-set-server = utf8mb4 และ utf8mb4 ที่อื่น ๆ ดังกล่าวข้างต้น
แชมป์

12
บน Ubuntu 12.04 สิ่งนี้ใช้ได้กับฉัน - ถ้าฉันลบบรรทัดแรกออกหลังจาก[mysqld]นั้น
Brandon Bertelsen

4
ดูเหมือนว่าชุดอักขระเริ่มต้นจะไม่ได้รับอนุญาตในส่วน [mysqld] อีกต่อไป
marsbard

4
โปรดทราบว่าถ้า UTF-8 เป็นสิ่งที่คุณต้องการอย่าใช้utf8ชุดอักขระของ MySQL ใช้utf8mb4แทน
Mathias Bynens

255

สำหรับ MySQL เวอร์ชันล่าสุด

default-character-set = utf8

ทำให้เกิดปัญหา ฉันคิดว่าเลิกแล้ว

ดังที่Justin Ballกล่าวใน " อัปเกรดเป็น MySQL 5.5.12 และตอนนี้ MySQL จะไม่เริ่มต้นคุณควร:

  1. ลบคำสั่งนั้นและคุณควรจะดี

  2. จากนั้นไฟล์การกำหนดค่าของคุณ (เช่น /etc/my.cnf ') ควรมีลักษณะดังนี้:

    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
  3. รีสตาร์ท MySQL

  4. เพื่อให้แน่ใจว่า MySQL ของคุณคือ UTF-8 ให้รันคำสั่งต่อไปนี้ในพรอมต์ MySQL ของคุณ:

    • แบบสอบถามครั้งแรก:

       mysql> show variables like 'char%';

      ผลลัพธ์ควรมีลักษณะดังนี้:

       +--------------------------+---------------------------------+
       | Variable_name            | Value                           |
       +--------------------------+---------------------------------+
       | character_set_client     | utf8                            |
       | character_set_connection | utf8                            |
       | character_set_database   | utf8                            |
       | character_set_filesystem | binary                          |
       | character_set_results    | utf8                            |
       | character_set_server     | utf8                            |
       | character_set_system     | utf8                            |
       | character_sets_dir       | /usr/local/mysql/share/charsets/|
       +--------------------------+---------------------------------+
    • แบบสอบถามที่สอง:

       mysql> show variables like 'collation%';

      และผลลัพธ์ของแบบสอบถามคือ:

       +----------------------+-----------------+
       | Variable_name        | Value           |
       +----------------------+-----------------+
       | collation_connection | utf8_general_ci |
       | collation_database   | utf8_unicode_ci |
       | collation_server     | utf8_unicode_ci |
       +----------------------+-----------------+

บรรทัดแรกของคุณคือ max_allowed_packet = 64M ที่เกี่ยวข้องกับปัญหา UTF8 นี้ด้วยวิธีใด?
malhal

character_set_filesystem | utf8ฉันมี ฉันไม่แน่ใจใช่ไหม
ลุง Lem

1
ลองใช้ MariaDB v5.5 แล้วใช้งานได้ดีขอบคุณ! mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
cenk

ฉันคิดว่าคุณไม่จำเป็นต้องลบdefault-character-setแต่คุณสามารถเปลี่ยนเป็นloose-default-character-set = utf8- นั่นคือคำนำหน้าด้วย 'loose-' นี้จะทำให้mysqlbinlogมีความสุขถ้าคุณต้องการที่จะใช้มัน - google สำหรับ: "หลวมเริ่มต้นตัวตั้ง" mysqlbinlog
KajMagnus

เป็นinit-connect='SET NAMES utf8'สิ่งที่จำเป็นจริงๆ? ถ้าไม่เราสามารถทำได้โดยไม่ต้องมีประสิทธิภาพ
datasn.io

56

คำถามนี้มีคำตอบอยู่แล้วจำนวนมาก แต่ Mathias Bynens กล่าวว่าควรใช้ 'utf8mb4' แทน 'utf8' เพื่อให้รองรับ UTF-8 ได้ดีกว่า ('utf8' ไม่สนับสนุนอักขระ 4 ไบต์ฟิลด์จะถูกตัดทอนเมื่อแทรก ) ฉันคิดว่านี่เป็นความแตกต่างที่สำคัญ ดังนั้นนี่คือคำตอบอีกวิธีในการตั้งค่าชุดอักขระเริ่มต้นและการเรียงชุดอักขระ หนึ่งที่จะช่วยให้คุณใส่กองปู (💩)

สิ่งนี้ใช้ได้กับ MySQL 5.5.35

โปรดทราบว่าการตั้งค่าบางอย่างอาจเป็นตัวเลือก ในขณะที่ฉันไม่แน่ใจว่าฉันไม่ได้ลืมอะไรเลยฉันจะตอบคำถามนี้เป็นวิกิชุมชน

การตั้งค่าเก่า

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

การกำหนดค่า

# 💩 𝌆
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

การตั้งค่าใหม่

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

character_set_system เป็น utf8

สิ่งนี้จะไม่มีผลกับตารางที่มีอยู่ แต่เป็นเพียงการตั้งค่าเริ่มต้น (ใช้สำหรับตารางใหม่) รหัส ALTERต่อไปนี้สามารถใช้เพื่อแปลงตารางที่มีอยู่ (โดยไม่มีวิธีแก้ไขปัญหาการถ่ายโอนข้อมูลคืนค่า):

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

แก้ไข:

บนเซิร์ฟเวอร์ MySQL 5.0: character_set_client, character_set_connection, character_set_results, collation_connection ยังคงอยู่ที่ latin1 การออกSET NAMES utf8(utf8mb4 ไม่มีในรุ่นนั้น) ตั้งค่าเป็น utf8 เช่นกัน


ข้อแม้ : หากคุณมีตาราง utf8 ที่มีคอลัมน์ดัชนีประเภท VARCHAR (255) จะไม่สามารถแปลงได้ในบางกรณีเนื่องจากความยาวสูงสุดของคีย์เกิน ( Specified key was too long; max key length is 767 bytes.) ถ้าเป็นไปได้ลดขนาดคอลัมน์จาก 255 เป็น191 (เพราะ 191 * 4 = 764 <767 <192 * 4 = 768) หลังจากนั้นสามารถแปลงตารางได้


ฉันติดตามการตั้งค่าของคุณแล้ว แต่ฉันพบว่าcharacter_set_databaseยังอยู่utf8และcollation_databaseเป็น utf8_bin` ฉันพลาดอะไรไปหรือเปล่า?
สจ๊วต

พบสิ่งที่ฉันพลาด การตั้งค่าทั้งสองนั้นจะถูกตั้งค่าเมื่อสร้างฐานข้อมูลเอง ดูคำถามนี้ stackoverflow.com/questions/22572558/…
Stewart

1
เพิ่มcharacter-set-client-handshake = FALSEไปที่ [mysqld] ส่วนดังนั้นจึงมักจะใช้ค่าเริ่มต้นการเข้ารหัสแม้ว่าคุณจะทำผิดพลาดในชั้นแอพลิเคชัน
Lukas Liesis

สวัสดีฉันลองใช้วิธีนี้แล้ว แต่ก็ยังไม่สามารถแสดง character_set_client | utf8mb4 มันคือ utf8 เพียงแค่ character_set_database utf8mb4 และ character_set_server utf8mb4 เป็น utf8mb4 อื่น ๆ ไม่เปลี่ยนแปลง โปรดช่วยฉันด้วย
Bhavin Chauhan

@ baic6 ฉันขอแนะนำให้เพิ่มบันทึกย่อเพื่ออธิบายว่าทำไมคอลัมน์ที่จัดทำดัชนีเท่านั้นที่สามารถทำให้เกิดปัญหาได้ ข้อ จำกัด 767 ไบต์ใช้สำหรับคอลัมน์ที่มีการจัดทำดัชนีเท่านั้นข้อ จำกัด สำหรับ "คีย์" s สำหรับคอลัมน์ที่ไม่มีการจัดทำดัชนีโดยทั่วไปจะไม่สามารถใช้ได้ หากคอลัมน์มีค่าที่มีความยาวสูงสุดไบต์ให้พูด 255 อักขระและใช้สูงสุด 3 ไบต์ของ utf8 ก็จะยังคงต้องการเพียง 255 * 3 ไบต์ utf8mb4 ในกรณีเหล่านี้จะใช้ 3 ไบต์เท่านั้นเช่นอักขระเหล่านี้ใน utf8mb4 ต้องการเพียง 3 ไบต์ นั่นคือยกเว้นว่าอักขระที่ไม่เหมาะสมใน utf8 นั้นถูกเก็บไว้ในคอลัมน์ซึ่งในกรณีนี้ข้อมูลจะสูญหายไปแล้ว
แซม

55

ใน MySQL 5.5 ฉันมีใน my.cnf

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

ผลที่ได้คือ

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

2
มันskip-character-set-client-handshakeจะต้องทำอะไรกันแน่และภายใต้สถานการณ์อะไร?
Simon East

3
@Simon เมื่อใช้show variables like "%collation%";ผมเห็น 'collation_connection' เป็นutf8_general_ciและ collation_database และ collation_server utf8_unicode_ciเป็น การเพิ่มบรรทัดskip-character-set-client-handshakeเปลี่ยนรายการทั่วไปเป็น Unicode ดังนั้นทั้งสามรายการจึงสอดคล้องกัน
Vaughany

2
บน MySQL 5.6 การข้ามชุดอักขระไคลเอนต์แฮนด์เชคไม่ได้ทำตามที่ @Vaughany พูด ข้อเสนอแนะใด ๆ
Ababneh A

4
skip-character-set-client-handshakeมันสำหรับฉัน (พร้อมกับ "ตัวตั้งเซิร์ฟเวอร์" และ "การเปรียบเทียบเซิร์ฟเวอร์" ของหลักสูตร - ใน Debian 7) init_connects ไม่ได้สร้างความแตกต่างมีหรือไม่มีskipและดูเหมือนซ้ำซ้อน +1 และขอบคุณ
Jeff

3
skip-character-set-client-handshakeละเว้นข้อมูลชุดอักขระที่ส่งโดยไคลเอนต์ เป็นเรื่องที่ดีสำหรับการบังคับให้มีชุดอักขระเฉพาะระหว่างการสื่อสาร แต่หากลูกค้าคาดหวังสิ่งอื่นมันอาจนำไปสู่ปัญหาได้ ฉันว่าคุณดีกว่าที่จะระบุสิ่งนี้ในไคลเอนต์ (ใบสมัครของคุณ)
0b10011

31

หมายเหตุ: ไฟล์ my.cnf อยู่ที่/etc/mysql/

หลังจากเพิ่มบรรทัดเหล่านี้:

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
skip-character-set-client-handshake

[client]
default-character-set   = utf8

[mysql]
default-character-set   = utf8

อย่าลืมรีสตาร์ทเซิร์ฟเวอร์:

sudo service mysql restart

2
หมายเหตุ: การเปลี่ยนแปลงนี้เป็นค่าเริ่มต้น มันไม่เปลี่ยนการเข้ารหัสสำหรับคอลัมน์ที่มีอยู่
Rick James

24

NijaCat อยู่ใกล้ แต่ระบุ overkill:

หากต้องการตั้งค่าเริ่มต้นเป็น UTF-8 คุณต้องการเพิ่มสิ่งต่อไปนี้ใน my.cnf

[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8

จากนั้นเพื่อยืนยัน:

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

5
คำตอบที่ดี บางทีคำอธิบายสั้น ๆ เกี่ยวกับชิ้นส่วนใดที่ overkill จะช่วยให้ผู้ใช้ตัดสินใจได้อย่างแม่นยำว่าพวกเขาต้องการอะไรในการกำหนดค่า
Mike Samuel

@ ดีเร็กแล้วจะ[mysql] default-character-set=utf8ทำอย่างไร?
Pacerier

1
กลุ่มตัวเลือก [ไคลเอนต์] ตั้งค่าตัวเลือกสำหรับไคลเอนต์ MySQL ทั้งหมดที่อ่านไฟล์ my.cnf แล้ว กลุ่ม [mysql] ตั้งค่าตัวเลือกสำหรับไบนารีไคลเอนต์ "mysql" โดยเฉพาะ หากคุณต้องการตั้งค่าตัวเลือก mysql ที่ไม่ได้ใช้กับลูกค้ารายอื่นการใช้กลุ่มนี้มีความเหมาะสม แต่การตั้งค่าตัวเลือกเดียวกันในสถานที่ทั้งสองนั้นซ้ำซ้อน dev.mysql.com/doc/refman/5.6/th/option-files.html
ดีเร็ก

@Mike Samuel การตั้งค่าอักขระเริ่มต้นตั้งค่าเป็น utf8 แสดงถึงโหมดการเรียงหน้าเริ่มต้นของ utf8_general_ci แล้ว ในทางกลับกัน "init-connect = 'SET NAMES utf8'" เป็นแนวคิดที่น่าสนใจเนื่องจากมันพยายามบังคับให้ไคลเอนต์ทั้งหมดที่เชื่อมต่อกับเซิร์ฟเวอร์ใช้ utf8 แต่สิ่งนี้จะไม่สอดคล้องกันขึ้นอยู่กับสิทธิ์การเชื่อมต่อของการเชื่อมต่อ ผู้ใช้และฉันสงสัยว่าลูกค้าบางรายที่เชื่อมต่อกับบุคคลที่สามอาจสับสนเมื่อเซิร์ฟเวอร์แทนที่ชุดอักขระที่ร้องขอ dev.mysql.com/doc/refman/5.6/th/charset-applications.html
ดีเร็ก

สำหรับ[mysqld]ใช้character-set-serverแทนdefault-character-set
Rick James

23

ฉันยังได้พบว่าหลังจากตั้งค่าdefault-character-set = utf8ภายใต้[mysqld]ชื่อ MySQL 5.5.x จะไม่เริ่มต้นภายใต้Ubuntu 12.04 (Precise Pangolin)


16
นั่นคือMySQL ข้อผิดพลาด # ภายใต้[mysqld]คุณควรใช้แทนcharacter-set-server default-character-set(ฉันสับสนอย่างมากฉันเห็นด้วย!)
Mathias Bynens

ใช่. คัดค้านใน 5.0; ลบออกใน 5.5
Rick James

22

MySQL v5.5.3 และสูงกว่า:

เพียงเพิ่มสามบรรทัดในส่วน [mysqld] เท่านั้น:

[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake

หมายเหตุ: การรวมskip-character-set-client-handshakeที่นี่จะทำให้จำเป็นต้องรวมทั้งinit-connectใน[mysqld]และdefault-character-setใน[client]และ[mysql]ส่วน


1
ว้าวคำตอบที่ซ้ำกันมากมายสำหรับคำถามนี้และนี่ดูเหมือนจะง่ายที่สุด ใช้ได้กับฉันใน v5.5.44 ด้วย
Justin Watt

9

ภายใต้ Xubuntu 12.04 ฉันเพิ่งเพิ่ม

[mysqld]
character_set_server = utf8

ถึง /etc/mysql/my.cnf

และผลที่ได้คือ

mysql> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

ลองดูที่http://dev.mysql.com/doc/refman/5.6/en/charset-server.html


คุณต้องการ [client] default-character-set = utf8 มิฉะนั้นเมื่อคุณใช้ mysql ที่บรรทัดคำสั่งมันจะไม่ใช้ utf8 ที่อาจทำลายการสำรองข้อมูลใด ๆ ที่คุณไพพ์ไปยังไฟล์
malhal

9

การตั้งค่าทั้งหมดที่ระบุไว้ที่นี่ถูกต้อง แต่นี่เป็นทางออกที่ดีที่สุดและเพียงพอ:

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

/etc/mysql/my.cnfเพิ่มเหล่านี้ไป

โปรดทราบว่าฉันเลือกการเปรียบเทียบประเภทutf8_unicode_ciเนื่องจากปัญหาด้านประสิทธิภาพ

ผลลัพธ์คือ:

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

และนี่คือเมื่อคุณเชื่อมต่อในฐานะผู้ใช้ที่ไม่ใช่ผู้ใช้ SUPERพิเศษ!

ตัวอย่างเช่นความแตกต่างระหว่างการเชื่อมต่อเป็นผู้ใช้ที่ไม่ใช่ผู้ใช้ SUPER และแน่นอน (ในกรณีของutf8_unicode_ciเปรียบเทียบ ):

ผู้ใช้ที่มีSUPER priv:

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci | <---
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

ผู้ใช้ที่ไม่ใช่บุคคลที่ไม่ใช่ SUPER :

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

ฉันเขียนบทความที่ครอบคลุม (rus) อธิบายรายละเอียดว่าทำไมคุณควรใช้ตัวเลือกใดตัวเลือกหนึ่ง ชุดอักขระและการเปรียบเทียบประเภททั้งหมดได้รับการพิจารณา: สำหรับเซิร์ฟเวอร์สำหรับฐานข้อมูลสำหรับการเชื่อมต่อสำหรับตารางและแม้กระทั่งสำหรับคอลัมน์

ฉันหวังว่าบทความนี้และบทความจะช่วยชี้แจงช่วงเวลาที่ไม่ชัดเจน


3
ฉันหวังว่าฉันจะสามารถอ่านบทความที่เชื่อมโยงของคุณ แต่ไม่สามารถอ่านภาษารัสเซียและ Google แปลไม่ได้มีประโยชน์สำหรับตำราทางเทคนิค จากสิ่งที่ฉันสามารถบอกได้ว่ามันน่าสนใจมาก คุณช่วยโปรดพิจารณาการโพสต์เวอร์ชันภาษาอังกฤษได้ไหม
Martijn Heemels

2
คุณสามารถอธิบายได้ว่าการตั้งค่าใดที่ล้มเหลวในการตั้งค่าการเปรียบเทียบการเชื่อมต่อผู้ใช้ SUPER? (และมีวิธีแก้ปัญหา)
KCD

@gahcep คุณระบุว่าคุณใช้utf8_unicode_ciเนื่องจากปัญหาด้านประสิทธิภาพแล้วทำไมจึงไม่ใช้utf8_binแทน
Pacerier

สวัสดี Paceriar จุดดี. ตอนนี้ฉันไม่แน่ใจว่าตัวเลือกของฉันถูกต้องเกี่ยวกับการใช้utf8_unicode_ciงานเลย ไม่เคยใช้เวลาในการทดสอบประสิทธิภาพ
gahcep


4

รุ่น MySQL และการแจกแจง Linux อาจมีความสำคัญเมื่อทำการกำหนดค่า

อย่างไรก็ตามการเปลี่ยนแปลงภายใต้[mysqld]ส่วนได้รับการสนับสนุน

ฉันต้องการคำอธิบายสั้น ๆ เกี่ยวกับคำตอบของ tomazzlender:

[mysqld] 
init_connect='SET collation_connection = utf8_unicode_ci' 
init_connect='SET NAMES utf8' 
character-set-server=utf8 
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

[mysqld]

สิ่งนี้จะเปลี่ยน collation_connection เป็น utf8_unicode_ci

init_connect='SET collation_connection = utf8_unicode_ci'

การใช้SET NAMES:

init_connect='SET NAMES utf8'

SET NAMES จะมีผลกับตัวละครสามตัวคือ:

character_set_client
character_set_results
character_set_connection

สิ่งนี้จะตั้งค่า character_set_database & character_set_server

character-set-server=utf8

สิ่งนี้จะส่งผลต่อ collation_database & collation_server เท่านั้น

collation-server=utf8_unicode_ci

ขออภัยฉันไม่แน่ใจว่าสิ่งนี้มีไว้เพื่ออะไร ฉันไม่ได้ใช้:

skip-character-set-client-handshake

เอกสารบันทึกว่าcharacter_set_serverไม่ควรตั้งค่าด้วยตนเอง
Brian

ดังนั้นวิธีการที่ทันสมัยคืออะไร? เราสามารถส่งผ่านอย่างชัดเจนcharacter setเมื่อสร้างการเชื่อมต่อฐานข้อมูล แต่ดูน่ารำคาญเล็กน้อย
Lihang Li

ที่จริงฉันทำผิด เอกสารระบุว่า character_set_database ไม่ควรตั้งค่าแบบไดนามิก ไม่ได้พูดถึง character_set_server อย่างไรก็ตามฉันไม่แน่ใจว่าคุณต้องกังวลเกี่ยวกับ character_set_server เนื่องจากฉันคิดว่ามันมีผลกับค่าเริ่มต้นสำหรับฐานข้อมูลที่สร้างขึ้นใหม่เท่านั้นหรือไม่
Brian

ที่ผมกล่าวถึงข้างต้นและที่ฉันได้ทดสอบอีกครั้งเพียงแค่ตอนนี้character_set_serverใน[mysqld]ส่วนที่จะส่งผลกระทบและcharacter_set_database character_set_serverตอนนี้ฉันคิดว่าวิธีปฏิบัติที่ดีคือชี้ให้เห็นอย่างชัดเจนถึงสิ่งcharacter setที่คุณต้องการใช้เมื่อสร้างฐานข้อมูลตารางและการเชื่อมต่อฐานข้อมูล สุจริตในการพูดเอกสารของmysqlไม่เข้าใจง่าย คุณรู้หรือไม่ว่ามีวิธีการทั่วไปในการทำcharacter setและcollationการตั้งค่าทั้งหมดใน mysql?
Lihang Li

4

ใน Fedora 21

$ vi /etc/my.cnf

เพิ่มการติดตาม:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci 
skip-character-set-client-handshake

บันทึกและออก.

สุดท้ายจำ mysqld service mysqld restartบริการเริ่มต้นใหม่กับ


1

MySQL 5.5 สิ่งที่คุณต้องการคือ:

[mysqld]
character_set_client=utf8
character_set_server=utf8
collation_server=utf8_unicode_ci

collation_server เป็นตัวเลือก

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

1

หากคุณมีปัญหาในการยืนยันการสนับสนุนชุดอักขระของลูกค้าโดยใช้ MySQL Workbench ให้จำไว้ดังต่อไปนี้:

สิ่งสำคัญ การเชื่อมต่อทั้งหมดที่เปิดโดย MySQL Workbench จะตั้งค่าชุดอักขระไคลเอ็นต์เป็น utf8 โดยอัตโนมัติ การเปลี่ยนชุดอักขระของไคลเอ็นต์ด้วยตนเองเช่นการใช้ SET NAMES ... อาจทำให้ MySQL Workbench แสดงอักขระไม่ถูกต้อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับชุดอักขระของไคลเอนต์โปรดดูชุดอักขระการเชื่อมต่อและการเปรียบเทียบ

ดังนั้นฉันจึงไม่สามารถแทนที่ชุดอักขระของ MySQL Workbench ด้วยการเปลี่ยนแปลง my.cnf เช่น 'set names utf8mb4'


1

หากคุณสับสนโดยการตั้งค่าไคลเอนต์และเชื่อมต่อใหม่อีกครั้งหลังจากเริ่มบริการ mysql ใหม่ ลองขั้นตอนเหล่านี้ (ซึ่งใช้งานได้สำหรับฉัน):

  1. vi /etc/my.cnf
  2. เพิ่มเนื้อหาระเบิดและ :wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
  3. รีสตาร์ท mysql และล็อกอิน mysql ใช้ฐานข้อมูลป้อนคำสั่งstatus;คุณจะพบชุดอักขระสำหรับ 'ไคลเอนต์' และ 'เชื่อมต่อ' ถูกตั้งค่าเป็น 'utf8'

ตรวจสอบการอ้างอิงสำหรับข้อมูลเพิ่มเติม


0

คุณสามารถทำได้อย่างที่มันเป็นและถ้ามันไม่ทำงานคุณต้องรีสตาร์ท mysql


-1

เปลี่ยนอักขระ MySQL:

ไคลเอนต์

default-character-set=utf8

mysqld

character_set_server=utf8

เราไม่ควรเขียนdefault-character-set=utf8ใน mysqld เพราะอาจทำให้เกิดข้อผิดพลาดเช่น:

start: งานไม่สามารถเริ่มต้นได้

ในที่สุด:

 +--------------------------+----------------------------+
 | Variable_name            | Value                      |
 +--------------------------+----------------------------+
 | character_set_client     | utf8                       |
 | character_set_connection | utf8                       |
 | character_set_database   | utf8                       |
 | character_set_filesystem | binary                     |
 | character_set_results    | utf8                       |
 | character_set_server     | utf8                       |
 | character_set_system     | utf8                       |
 | character_sets_dir       | /usr/share/mysql/charsets/ |
 +--------------------------+----------------------------+
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.