แก้ปัญหา charset ของ mysql กับปัญหาภาษาไทยอ่านไม่ออก ?

ปัญหา charset ใน MySQL ที่ทำให้ภาษาไทยอ่านไม่ออกสามารถแก้ไขได้โดยตรงในการตั้งค่าของ MySQL Database, Table, หรือ Column

ก่อนอื่นมาทำความเข้าใจกับระบบ charset กันก่อนครับ

    เดิมทีระบบการเก็บข้อมูลของ mysql เวอร์ชั่นต่ำกว่า 4.0.xx จะเป็นการเก็บแบบ ascii แล้วใช้ charset เป็นตัวกำหนดภาษา กล่าวคือแต่ละตัวอักษรจะใช้พื้นที่ในการเก็บ 1 byte เป็นค่า 0-255 และใช้ charset มาเป็นตัวกำหนดว่าจะเอาตารางตัวอักษรของภาษาใหนมาใช้ ซึ่งค่าที่เก็บอยู่ในตารางก็จะเป็น 0-255 เหมือนเดิม

    ดังนั้นจึงไม่มีปัญหาเรื่องภาษาไทยกับ mysql เวอร์ชั่นต่ำกว่า 4.0.xx หากการแสดงผลไม่เป็นภาษาไทย ก็แค่เลือก encoding ของ browser ให้เป็น windows-874 หรือ tis-620 ก็จะแสดงได้ถูกต้อง ซึ่งข้อจำกัดคือสามารถแสดงผลได้เพียง 255 รูปแบบตัวอักษรตาม charset ที่นำมาใช้

    ตั้งแต่ mysql เวอร์ชั่น 4.1.xx (จริงๆเริ่มที่ 4.0.??) ขึ้นมาจะรองรับการเก็บข้อมูลแบบ unicode ซึ่งจะมีการเก็บ charset ไว้ด้วย ดังนั้นการเก็บข้อมูลของ 1 ตัวอักษรจะใช้พื้นที่อย่างน้อย 2 byte ขึ้นไป ดังนั้นการแสดงผลแต่ละตัวอักษรสามารถแสดงออกมาตาม charset ที่ระบุไว้ของตัวอักษรนั้นๆ ทำให้สามาถแสดงผลได้ทุกภาษาที่ต้องการพร้อมๆกันในหน้าเดียว

    สำหรับภาษาไทยในเวอร์ชั่น 4.1 ที่ compatible กับ 4.0 ก็คือการเก็บภาษาไทยแบบ ascii ลงในตาราง latin1-swedish ซึ่งในการใช้งานกับ 4.1 สามารถใช้งานได้เหมือนกับการใช้งานบน 4.0 ทุกประการ

    sql ที่ export มาจาก 4.0 นำมา import ลงบน 4.1 แบบ latin1 จะสามารถแสดงผลบน browser ที่เลือก charset เป็น tis-620 ได้ทันที โดยไม่ต้องมีการแปลงใดๆ


การใช้ภาษาไทยแบบ unicode บน mysql 4.1

    จะเป็นการเก็บภาษาไทยในรหัส unicode บนตารางแบบ utf8_unicode หรือ tis620_unicode ซึ่งไม่ใช่ latin1_swedishสำหรับเวบที่เริ่มต้นสร้าง database ใหม่บน mysql4.1 โดยสร้างเป็นแบบ tis620_unicode หรือ utf8 ก็จะสามารถบันทึกและแสดงผลภาษาไทยได้อย่าวไม่มีปัญหา เนื่องจากตัว mysql จะ connect db นั้นๆตาม charset ที่สร้างไว้


แล้วปัญหาภาษาไทยอ่านไม่ออกเกิดจากอะไร?

    ปัญหานี้มักเกิดจากการ export แล้วมา import จากระบบหนึ่งมายังอีกระบบหนึ่ง ซึ่งใช้ charset ไม่สอดคล้องสัมพันธ์กัน เช่นนำ sql ที่ export จาก mysql4.0 มา import เข้า mysql4.1 แบบ tis620_unicode แทนที่จะเป็น latin1_swedish ก็จะเกิดปัญหาภาษาไทยกลายเป็นตัวอักขระ


การ export และ import database

ก่อนอื่นให้ตรวจสอบข้อมูลเบื้องต้นต่อไปนี้

1. Version ของ mysql ต้นทาง

2. Version ของ phpmyadmin ต้นทาง

3. Charset ของ DB และ Table ต้นทาง

4. Version ของ mysql ปลายทาง

5. Version ของ phpmyadmin ปลายทาง

6. Charset ของ DB ปลายทาง ทีเ่กิดจากการสร้าง db เปล่าๆขึ้นมาผ่าน cp


ควรระบุข้อมูล 6 ข้อข้างบนให้ครบเวลามาถามปัญหา เพื่อจะได้บอกวิธีแก้ได้ถูกต้อง

เมื่อมีข้อมูลข้างต้นก็จะสามารถบอกได้ว่า

1. จะต้อง export ไฟล์ sql ด้วย charset อะไร หรือใช้ phpmyadmin เวอร์ชั่นใหม่หรือเก่าช่วยในการ export

2. charset ของ db ที่จะต้องแก้ไขหลังจากสร้าง db ขึ้นมาก่อนทำการ import ข้อมูล

3. charset ที่จะต้องเลือกในการ import ข้อมูลจากไฟล์ sql ที่มีอยู่


หลักการ convert charset

    สามารถทำได้บน mysql 4.1 ขึ้นไป โดยทำการแปลงจาก charset ปัจจุบันให้เป็น binary ก่อนแล้วจึงแปลงไปเป็น charset ที่ต้องการ โดยใช้เมื่อทำการ import ข้อมูลภาษาไทยลงในตารางที่มี charset ไม่ตรงกับข้อมูล ไปเป็น charset ที่ตรงกับข้อมูล

    ตัวอย่าง

    เมื่อทำการ export / import ข้อมูลในเครื่องเดียวกัน บน mysql 4.1 charset latin1 ด้วย phpmyadmin และ charset ต่างๆกัน
    ไฟล์ SQL Export ไว้ด้วย             ---  นำมา Import ด้วย                              ---   ได้ผลลัพธ์
    PhpMyadmin 2.5.4 (tis-620)  ---  PhpMyadmin 2.5.4 (tis-620)           ---   ภาษาไทยถูกต้อง

    PhpMyadmin 2.5.4 (tis-620)  ---  PhpMyadmin 2.7.2 (Latin1)            ---   ภาษาไทยถูกต้อง
    PhpMyadmin 2.5.4 (tis-620)  ---  PhpMyadmin 2.7.2 (Binary)            ---   ภาษาไทยถูกต้อง
    PhpMyadmin 2.5.4 (tis-620)  ---  PhpMyadmin 2.7.2 (tis-620-UTF)    ---   ?? ?? ??
    PhpMyadmin 2.5.4 (tis-620)  ---  PhpMyadmin 2.7.2 (UTF8)              ---   ?? ?? ??

    PhpMyadmin 2.7.2 (Latin1)   ---  PhpMyadmin 2.5.4 (tis-620-UTF)    ---   รยฃร?ฦจ?ขก

    PhpMyadmin 2.7.2 (Latin1)   ---  PhpMyadmin 2.7.2 (tis-620)           ---   ?? ?? ??
    PhpMyadmin 2.7.2 (Latin1)   ---  PhpMyadmin 2.7.2 (Latin1)            ---   รยฃร?ฦจ?ขก
    PhpMyadmin 2.7.2 (Latin1)   ---  PhpMyadmin 2.7.2 (Binary)            ---   รยฃร?ฦจ?ขก
    PhpMyadmin 2.7.2 (Latin1)   ---  PhpMyadmin 2.7.2 (UTF8)              ---   ภาษาไทยถูกต้อง
    PhpMyadmin 2.7.2 (UTF8)     ---  PhpMyadmin 2.7.2 (UTF8)              ---   ภาษาไทยถูกต้อง


    หมายเหตุ

    ถ้าเดิมเก็บเป็น utf8 อยู่บน mysql 4.0 เปิดด้วย phpmyadmin ก็จะอ่านไม่ออกอยู่แล้วแต่ตอน query มาแสดงผลบนเวบด้วย encoding utf-8 จะอ่านออกเอง ดังนั้นเมื่อ export ออกมาเป็นไฟล์ .sql ก็จะอ่านไม่ออกเหมือนกัน การนำมา import เข้า mysql 4.1 สามารถใช้ phpmyadmin เวอร์ชั่น >2.7 ทำการ import ได้ แต่ก่อนทำการ import จะต้องแก้ collation ของ db ให้เป็น utf8_unicode_ci ก่อน

    ขอบคุณที่มา : คุณ kke

Solutions
Zimbra Cloud Mail
อีเมลพร้อมใช้งานเหมาะสำหรับทั้งบุคคลและองค์กร เพื่อปรับปรุงการสื่อสารได้สะดวกและปลอดภัย บริการดูแลช่วยเหลือตลอด 24 ชม. จากทีม Zimbra
Dedicated Email Server
ระบบอีเมลเซิร์ฟเวอร์ส่วนตัวเพื่อรับส่งและจัดเก็บอีเมลโดยเฉพาะสำหรับผู้ใช้รายเดียว เหมาะกับองค์กรที่ต้องการระบบอีเมลที่มีความเป็นส่วนตัวสูง
Zimbra Coexistence Deployment
ใช้งานอีเมล 2 แพลตฟอร์มภายใต้ชื่อ โดเมนเดียวกันเป็นวิธีลดค่าใช้จ่ายและ เพิ่มประสิทธิภาพการสื่อสาร
Recommend Articles
blog-1
Outlook New

Microsoft Outlook New For Windows

schedule  25 Mar 2024
blog-1
Microsoft Outlook 365 และ Exchange ปิดการตั้งค่า POP3 | IMAP ตั้งแต่ เดือนกุมภาพันธ์ 2567

Outlook365 | Exchange ปัจจุบัน Microsoft ได้ปิดการใช้งานการตั้งค่า POP3/IMAP เรื่องความปลอดภัย ถ้าต้องการใช้งานต้อง PowerShell เปิดเพื่อ Enable เท่านั้น

schedule  25 Mar 2024