การเข้ารหัสให้ถูกต้องเป็นเรื่องยุ่งยากมากมีหลายเลเยอร์เกินไป:
- เบราว์เซอร์
- หน้า
- PHP
- MySQL
คำสั่ง SQL "SET CHARSET utf8" จาก PHP จะช่วยให้มั่นใจได้ว่าฝั่งไคลเอ็นต์ (PHP) จะได้รับข้อมูลใน utf8 ไม่ว่าจะเก็บไว้ในฐานข้อมูลอย่างไร แน่นอนว่าต้องจัดเก็บให้ถูกต้องก่อน
คำจำกัดความ DDL เทียบกับข้อมูลจริง
การเข้ารหัสที่กำหนดไว้สำหรับตาราง / คอลัมน์ไม่ได้หมายความว่าข้อมูลนั้นอยู่ในการเข้ารหัสนั้นจริงๆ หากคุณบังเอิญมีตารางที่กำหนดutf8
แต่จัดเก็บเป็นการเข้ารหัสที่แตกต่างกัน MySQL จะถือว่าเป็นutf8
และคุณมีปัญหา ซึ่งหมายความว่าคุณต้องแก้ไขปัญหานี้ก่อน
สิ่งที่ต้องตรวจสอบ
คุณต้องตรวจสอบสิ่งที่เข้ารหัสการไหลของข้อมูลในแต่ละเลเยอร์
- ตรวจสอบส่วนหัว HTTP ส่วนหัว
- ตรวจสอบสิ่งที่ส่งมาจริงๆในเนื้อหาของคำขอ
- อย่าลืมว่า MySQL มีการเข้ารหัสเกือบทุกที่:
- ฐานข้อมูล
- ตาราง
- คอลัมน์
- เซิร์ฟเวอร์โดยรวม
- ลูกค้า
ตรวจสอบให้แน่ใจว่ามีที่ถูกต้องทุกที่
การแปลง
หากคุณได้รับข้อมูลในเช่นwindows-1250
และต้องการจัดเก็บutf-8
ให้ใช้ SQL นี้ก่อนจัดเก็บ:
SET NAMES 'cp1250';
หากคุณมีข้อมูลใน DB เป็นwindows-1250
และต้องการเรียกคืนให้utf8
ใช้:
SET CHARSET 'utf8';
หมายเหตุเพิ่มเติม:
- อย่าพึ่งพาเครื่องมือที่ "ฉลาด" เกินไปในการแสดงข้อมูล เช่น phpMyAdmin ทำ (กำลังทำเมื่อฉันใช้งาน) การเข้ารหัสไม่ดีจริงๆ และมันผ่านทุกชั้นจึงยากที่จะค้นพบ
- นอกจากนี้ Internet Explorer ยังมีพฤติกรรมที่โง่เขลาในการ "คาดเดา" การเข้ารหัสตามกฎแปลก ๆ
- ใช้เครื่องมือแก้ไขอย่างง่ายที่คุณสามารถเปลี่ยนการเข้ารหัสได้ ฉันแนะนำ MySQL Workbench