นโยบายการจัดการความรู้ มหาวิทยาลัยสงขลานครินทร์ 1.ให้ใช้เครื่องมือการจัดการความรู้ผลักดัน คุณภาพคน และกระบวนทำงาน 2.ส่งเสริมการแลกเปลี่ยนประสบการณ์การทำงาน จากหน้างาน 3.ส่งเสริมให้มีเวทีเรียนรู้ร่วมกัน

วิภัทร ศรุติพรหม
Ico64
วิภัทร ศรุติพรหม
หัวหน้ากลุ่มงานวิจัยและพัฒนา
ศูนย์คอมพิวเตอร์ ม.สงขลานครินทร์
เครือข่าย
สมาชิก · ติดตาม: 0 · ผู้ติดตาม: 4

อ่าน: 3034
ความเห็น: 1

ภาษาไทยกับ mysql บนลินุกซ์ [C]

ภาษาไทยกับ mysql

ผมขอต่อยอดจากบันทึก http://share.psu.ac.th/blog/myopensource/5136 , บันทึก http://share.psu.ac.th/blog/myopensource/5425 และเอกสาร ftp://ftp.psu.ac.th/pub/wunca17/500627-wipat.pdf

จากภาระกิจที่ต้อง upgrade moodle 1.5.4 มาเป็น 1.9 ทำให้ผมต้องปวดหัวกะภาษาไทยบน mysql ท้ายที่สุดก็ปล้ำจนสำเร็จ สรุปความแบบย่อๆ ดังนี้คือว่า mysql 4.x ขึ้นไปสนับสนุนภาษาไทยที่ encoding แบบ utf8 เท่านั้น ไม่รองรับภาาษาไทย tis620 ที่ encoding แบบ 8 bit ดูจากแฟ้ม /usr/share/mysql/charsets/Index.xml จะมีข้อมูลรหัส tis620 แต่ไม่มีตาราง /usr/share/mysql/charsets/tis620.xml 

ดังนั้นผู้ใช้ภาษาไทยจึงต้องไปอาศัยภาษาละติน latin1 ซึ่งมี encoding แบบ 8 bit เหมือนกัน tis620 ซึ่งวิธีนี้สามารถเข้าถึงข้อมูลได้ถูกต้อง แต่จะ sort ภาษาไทยผิดไปบ้าง

ผลกระทบหนักๆก็คือ mysql จะทำการ encoding แบบ 8 bit มั่งหรือ utf8 มั่ง ทำงานตามยถากรรม(defualt)ของโปรแกรมหรือคำสั่งต่างๆที่มาเชื่อมต่อ

สำหรับผู้ใช้คำสั่ง mysql และ mysqldump บนลินุกซ์ผมขอแนะนำตามตัวอย่างโดยประมาณดังนี้

สั่งสร้าง database ที่ encoding แบบ 8 bit

mysql> CREATE DATABASE mydatabase CHARACTER SET latin1 ;

หากต้องการเป็น encoding แบบ utf8 ก็ใช้คำสั่งว่า
mysql> CREATE DATABASE mydatabase CHARACTER SET utf8 ;

ตอนใช้ mysqldump ในการ dump ข้อมูล แบบ 8 bit ต้องไม่ให้เหลือซาก latin1 ไว้ในข้อมูล ด้วยวิธีดังนี้

mysqldump -u root -p  --default-character-set=latin1  --skip-set-charset mydatabse | sed "s/DEFAULT CHARSET=latin1//"  > mybackup-without-latin1.sql 

ตอน restore ข้อมูลแบบ 8 bit ด้วยกันใช้คำสั่ง

mysql -u root -p --default-character-set=latin1 mydatabase < mybackup-without-latin1.sql

แต่ถ้า dump ข้อมูลแบบ utf8 ก็ไปตรงๆได้ดังคำสั่ง

mysqldump -u root -p  --default-character-set=utf8 mydatabse > mybackup-utf8.sql

ตอน restore ข้อมูลแบบ utf8 ด้วยกันใช้คำสั่ง

mysql -u root -p --default-character-set=utf8 mydatabase < mybackup-utf8.sql

หากต้องการ upgrade จาก 8 bit เป็น utf8  ก็ต้องสร้าง database ให้เป็นแบบ utf8 รอไว้ก่อน แล้วนำข้อมูลที่ dump เป็น 8 bit ไว้แล้วมาใส่คืนให้เป็นแบบ utf8 ด้วยคำสั่งว่า

mysql -u root -p --default-character-set=tis620 mydatabase < mybackup-without-latin1.sql

แค่นี้ก็จะได้ database ตัวใหม่ที่เป็นภาษาไทย utf8 ไว้ใช้งานแล้ว

สำหรับบนวินโดวส์ XP ผมไม่รู้ว่าต้องทำยังไงมั่ง หากใครรู้แล้วมาบอกกันมั่งครับ 

--วิภัทร 

หมวดหมู่บันทึก: เรื่องทั่วไป
คำสำคัญ (keywords): linux  mysql  ศูนย์คอมพิวเตอร์
สัญญาอนุญาต: สงวนสิทธิ์ทุกประการ Copyright
สร้าง: 14 มีนาคม 2551 12:40 แก้ไข: 21 มิถุนายน 2552 14:39 [ แจ้งไม่เหมาะสม ]
ดอกไม้
สมาชิกที่ให้กำลังใจ
 
Facebook
Twitter
Google

บันทึกอื่นๆ

ความเห็น

เมื่อเราแปลงเป็น UTF8 แล้ว ขนาดของ DB จะใหญ่ขึ้นถึง 3 เท่าเลยที่เดียว
เพราะว่าใช้เนื้อี่เก็ฌบถึง 3 byte เลยทีเดียว

ปัญหาอีกข้อคือมันเรียงภาษาไทยไม่ค่อยถูกต้องเท่าไหร่ครับ
ซึ่งเป็น ปัญหาที่น่าปวดหัวที่สุด

ถ้าใช้ TIS-620 จะเรียงได้ถูกต้อง
ซึ่งเป็นสาเหตหนึ่งที่ทำให้ต้องเปลี่ยนกลับมาใช้ TIS-620 เหมือนเดิม

และอีกปัญหานึงคือ มัน Max length in bytes ที่ 1000 byte เท่านั้นครับ ถ้าปกติ มันจะไม่มีปัญหาอะไร แต่ถ้าเป็น utf8 มันจะได้แค่ 333 ตัวเท่านั้น มันจะมีปัญหากับ table แบบ myisam แต่ถ้าสร้าง แบบ innodb ผมไม่ทราบว่ามันจะมีปัญหาที่ limit เท่าไหร
ซึ่งทางแก้ของผม คือทำการ debug code ของ mysql เพื่อแก้ Max length in bytes

คุณต้องทำการเข้าระบบก่อนแสดงความเห็น