ทำไมค่าเริ่มต้น character_set_server คือ latin1


12

ฉันใช้ MySQL 5.5 และเมื่อฉันแสดงตัวแปรเกี่ยวกับชุดอักขระฉันมี

+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

ฉันต้องเปลี่ยนcharacter_set_databaseและcharacter_set_serverไปที่utf8?

คำตอบ:


8

ลองคิดดู:

  • คุณกำลังจัดเก็บข้อมูลในฐานข้อมูลเป็น latin1
  • คุณคือข้อมูลถูกจัดการภายในโดย mysqld เป็น latin1

หากข้อมูลมาจากระบบปฏิบัติการหรือจากการเชื่อมต่อutf8mysqld จะจัดการกับมันอย่างไร?

แทนที่จะคาดเดาหรือคาดหวังสิ่งที่ดีที่สุดคุณสามารถเปลี่ยนพฤติกรรมของชุดอักขระที่เข้ามาได้ ยกเว้นinformation_schemaและmysqlใช้ฐานข้อมูลทั้งหมดของคุณและตั้งค่าอักขระเริ่มต้นเป็นutf8:

ALTER DATABASE dbname CHARACTER SET utf8;

หากคุณมีคำอธิบายที่เฉพาะเจาะจงที่จะไปกับมันให้ทำสิ่งนี้:

ALTER DATABASE dbname COLLATE 'utf8_general_ci';

นี่คือการเปรียบเทียบที่จะเลือกจาก:

mysql> select * from information_schema.collations where CHARACTER_SET_NAME = 'utf8';
+--------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME     | CHARACTER_SET_NAME | ID  | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci    | utf8               |  33 | Yes        | Yes         |       1 |
| utf8_bin           | utf8               |  83 |            | Yes         |       1 |
| utf8_unicode_ci    | utf8               | 192 |            | Yes         |       8 |
| utf8_icelandic_ci  | utf8               | 193 |            | Yes         |       8 |
| utf8_latvian_ci    | utf8               | 194 |            | Yes         |       8 |
| utf8_romanian_ci   | utf8               | 195 |            | Yes         |       8 |
| utf8_slovenian_ci  | utf8               | 196 |            | Yes         |       8 |
| utf8_polish_ci     | utf8               | 197 |            | Yes         |       8 |
| utf8_estonian_ci   | utf8               | 198 |            | Yes         |       8 |
| utf8_spanish_ci    | utf8               | 199 |            | Yes         |       8 |
| utf8_swedish_ci    | utf8               | 200 |            | Yes         |       8 |
| utf8_turkish_ci    | utf8               | 201 |            | Yes         |       8 |
| utf8_czech_ci      | utf8               | 202 |            | Yes         |       8 |
| utf8_danish_ci     | utf8               | 203 |            | Yes         |       8 |
| utf8_lithuanian_ci | utf8               | 204 |            | Yes         |       8 |
| utf8_slovak_ci     | utf8               | 205 |            | Yes         |       8 |
| utf8_spanish2_ci   | utf8               | 206 |            | Yes         |       8 |
| utf8_roman_ci      | utf8               | 207 |            | Yes         |       8 |
| utf8_persian_ci    | utf8               | 208 |            | Yes         |       8 |
| utf8_esperanto_ci  | utf8               | 209 |            | Yes         |       8 |
| utf8_hungarian_ci  | utf8               | 210 |            | Yes         |       8 |
| utf8_sinhala_ci    | utf8               | 211 |            | Yes         |       8 |
+--------------------+--------------------+-----+------------+-------------+---------+
22 rows in set (0.03 sec)

คุณสามารถวิ่งได้

mysql> show collation where charset='utf8';
+--------------------+---------+-----+---------+----------+---------+
| Collation          | Charset | Id  | Default | Compiled | Sortlen |
+--------------------+---------+-----+---------+----------+---------+
| utf8_general_ci    | utf8    |  33 | Yes     | Yes      |       1 |
| utf8_bin           | utf8    |  83 |         | Yes      |       1 |
| utf8_unicode_ci    | utf8    | 192 |         | Yes      |       8 |
| utf8_icelandic_ci  | utf8    | 193 |         | Yes      |       8 |
| utf8_latvian_ci    | utf8    | 194 |         | Yes      |       8 |
| utf8_romanian_ci   | utf8    | 195 |         | Yes      |       8 |
| utf8_slovenian_ci  | utf8    | 196 |         | Yes      |       8 |
| utf8_polish_ci     | utf8    | 197 |         | Yes      |       8 |
| utf8_estonian_ci   | utf8    | 198 |         | Yes      |       8 |
| utf8_spanish_ci    | utf8    | 199 |         | Yes      |       8 |
| utf8_swedish_ci    | utf8    | 200 |         | Yes      |       8 |
| utf8_turkish_ci    | utf8    | 201 |         | Yes      |       8 |
| utf8_czech_ci      | utf8    | 202 |         | Yes      |       8 |
| utf8_danish_ci     | utf8    | 203 |         | Yes      |       8 |
| utf8_lithuanian_ci | utf8    | 204 |         | Yes      |       8 |
| utf8_slovak_ci     | utf8    | 205 |         | Yes      |       8 |
| utf8_spanish2_ci   | utf8    | 206 |         | Yes      |       8 |
| utf8_roman_ci      | utf8    | 207 |         | Yes      |       8 |
| utf8_persian_ci    | utf8    | 208 |         | Yes      |       8 |
| utf8_esperanto_ci  | utf8    | 209 |         | Yes      |       8 |
| utf8_hungarian_ci  | utf8    | 210 |         | Yes      |       8 |
| utf8_sinhala_ci    | utf8    | 211 |         | Yes      |       8 |
+--------------------+---------+-----+---------+----------+---------+
22 rows in set (0.00 sec)

mysql>

ในการดูชุดอักขระแต่ละตัวของฐานข้อมูลให้ดำเนินการดังนี้

mysql> show create database sample;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| sample   | CREATE DATABASE `sample` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

สำหรับการตั้งค่าคุณสามารถลอง:

เพิ่มสายไป my.cnf

[mysqld]
character_set_database=utf8
character_set_server=utf8

จากนั้นเริ่ม mysql ใหม่

ฉันพูดถึงเรื่องนี้ย้อนหลังเมื่อวันที่ 1 สิงหาคม 2011: การเข้ารหัสชุดอักขระในตาราง

CAVEAT (สำหรับ MySQL DB Servers ใน Windows)

คำสั่งเหล่านี้

ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';

ไม่ทำงานในรุ่น Windows ของ MySQL เพราะวิธีที่ Windows ล็อคไฟล์ ไฟล์ที่จำเป็นจะเรียกว่าซึ่งตั้งอยู่ในโฟลเดอร์ย่อยของฐานข้อมูลในdb.optdatadir

คุณอาจต้องทำสิ่งต่อไปนี้:

  • mysqldump ฐานข้อมูลนั้น (ไม่มีฐานข้อมูลที่สร้างข้อมูลเพียงแค่สร้างตารางและ INSERTs)
  • ปล่อยฐานข้อมูลนั้น
  • สร้างฐานข้อมูลด้วยชุดอักขระเฉพาะและการเปรียบเทียบ
  • โหลดลงในกองขยะอีกครั้ง

บทส่งท้าย

ไม่ว่าคุณจะทำอะไรโปรดทำการเปลี่ยนแปลงใด ๆ บนเซิร์ฟเวอร์ Dev / Staging เพื่อดูว่าคุณได้รับเอฟเฟกต์ที่ต้องการหรือไม่

อัพเดท 2012-12-05 11:00 EDT

คำถามของคุณ

ฉันควรเปลี่ยนหรือไม่

เพื่อรับประกันการรักษาข้อมูลที่เหมาะสมคุณอาจต้องแน่ใจว่าคุณมีแอปเปิ้ลต่อแอปเปิ้ล ข้อมูลที่จัดเตรียมเป็นชุดอักขระหนึ่งชุดและโหลดลงในตารางพร้อมฐานข้อมูลอาจจัดเรียงข้อมูลราวกับว่าชุดอักขระอื่นอาจไม่แสดงข้อมูลกับชุดอักขระ mysqld ที่เห็นเมื่อดึงและส่งกลับไปยังฐานข้อมูลการเชื่อมต่อ ลองโหลดฐานข้อมูลบนเซิร์ฟเวอร์ Dev / Staging และทดลองตั้งค่าชุดอักขระเริ่มต้น

ทำไมค่าเริ่มต้นบางอย่างใช้utf8แต่การใช้เริ่มต้นบางอย่างlatin1?

สิ่งนี้จะขึ้นอยู่กับ MySQL เวอร์ชันไบนารีของระบบปฏิบัติการ Windows รุ่นอาจมีในขณะที่รุ่นอาจจะใช้ลินุกซ์latin1utf8


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

1
(ขอบคุณอีกครั้งก่อน) สิ่งนี้จะขึ้นอยู่กับเวอร์ชันระบบปฏิบัติการของ MySQL Binary <- ฉันหมายถึงเมื่อฉันอยู่บน Ubuntu ทำไมค่าเริ่มต้นถูกผสมระหว่างlatin1และutf8เช่นcharacter_set_connectionutf8 แต่character_set_databaseเป็น latin1
Yoga

1
@Rolando [mysqld] character_set_database=utf8 character_set_server=utf8ไม่ทำงาน
Jorge B.

ฉันยังไม่เข้าใจ ... ถึงแม้ว่า OS โฮสต์จะใช้ชุดอักขระที่ จำกัด อย่างโง่ ๆ แต่ก็ไม่ควรใช้ฐานข้อมูลโดยใช้ข้อความเก็บเริ่มต้นในชุดอักขระที่สามารถใช้แทนอักขระใด ๆ แม้ว่าจะยอมรับอินพุตlatin1และต้องทำการแปลง สำหรับการจัดเก็บ?
Andy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.