ลองคิดดู:
- คุณกำลังจัดเก็บข้อมูลในฐานข้อมูลเป็น
latin1
- คุณคือข้อมูลถูกจัดการภายในโดย mysqld เป็น
latin1
หากข้อมูลมาจากระบบปฏิบัติการหรือจากการเชื่อมต่อutf8
mysqld จะจัดการกับมันอย่างไร?
แทนที่จะคาดเดาหรือคาดหวังสิ่งที่ดีที่สุดคุณสามารถเปลี่ยนพฤติกรรมของชุดอักขระที่เข้ามาได้ ยกเว้น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.opt
datadir
คุณอาจต้องทำสิ่งต่อไปนี้:
- mysqldump ฐานข้อมูลนั้น (ไม่มีฐานข้อมูลที่สร้างข้อมูลเพียงแค่สร้างตารางและ INSERTs)
- ปล่อยฐานข้อมูลนั้น
- สร้างฐานข้อมูลด้วยชุดอักขระเฉพาะและการเปรียบเทียบ
- โหลดลงในกองขยะอีกครั้ง
บทส่งท้าย
ไม่ว่าคุณจะทำอะไรโปรดทำการเปลี่ยนแปลงใด ๆ บนเซิร์ฟเวอร์ Dev / Staging เพื่อดูว่าคุณได้รับเอฟเฟกต์ที่ต้องการหรือไม่
อัพเดท 2012-12-05 11:00 EDT
คำถามของคุณ
ฉันควรเปลี่ยนหรือไม่
เพื่อรับประกันการรักษาข้อมูลที่เหมาะสมคุณอาจต้องแน่ใจว่าคุณมีแอปเปิ้ลต่อแอปเปิ้ล ข้อมูลที่จัดเตรียมเป็นชุดอักขระหนึ่งชุดและโหลดลงในตารางพร้อมฐานข้อมูลอาจจัดเรียงข้อมูลราวกับว่าชุดอักขระอื่นอาจไม่แสดงข้อมูลกับชุดอักขระ mysqld ที่เห็นเมื่อดึงและส่งกลับไปยังฐานข้อมูลการเชื่อมต่อ ลองโหลดฐานข้อมูลบนเซิร์ฟเวอร์ Dev / Staging และทดลองตั้งค่าชุดอักขระเริ่มต้น
ทำไมค่าเริ่มต้นบางอย่างใช้utf8
แต่การใช้เริ่มต้นบางอย่างlatin1
?
สิ่งนี้จะขึ้นอยู่กับ MySQL เวอร์ชันไบนารีของระบบปฏิบัติการ Windows รุ่นอาจมีในขณะที่รุ่นอาจจะใช้ลินุกซ์latin1
utf8