Mysql กับภาษาไทย
เริ่มต้นกับ UTF-8 พร้อมโปรแกรมแปลง TIS-620 เป็น UTF-8
UTF-8 คือ character ที่สามารถรองรับการทำงานระบบหลายภาษา (Multi language)
ระบบ UTF-8 จะเก็บข้อมูล 1 - 4 ไบต์ต่อ 1 ตัวอักษร รายละเอียดอื่นๆ แนะนำ
http://en.wikipedia.org/wiki/UTF-8 ชัดเจนกว่าครับ
สำหรับคนไทยถึงเวลาแล้วหรือยังที่จะเปลี่ยนจาก TIS-620 เป็น UTF-8 ?
ในเรื่องนี้ก็คงต้องแล้วแต่ความคิดส่วนตัวของแต่ละบุคคลครับ ว่าสามารถยอมรับระบบใหม่ได้ไหม
แต่ในปัจจุบันสำหรับครับคิดผมก็คือ ถึงเวลาแล้วสำหรับ UTF-8 การที่เราจะรออนาคตให้มีการเปลี่ยนแปลง
แล้วเราจะเปลี่ยนตาม ตัวเราเองน่าจะเป็นผู้กำหนดอนาคตเอง มากกว่าให้คนอื่นมากำหนดอนาคตให้กับเรา
ในอดีตภาษาไทยที่มาก่อนรหัส TIS-620 (รหัสสมอ.) นั่นก็คือรหัสเกษตร สำหรับใครที่ใช้ DOS สมัยก่อน
คงจะรู้จักกันดี ในอดีตเราก็ยังเปลี่ยนแปลงจากรหัสเกษตรเป็น TIS-620 ได้ การที่เราจะเปลี่ยนแปลง
ปัจจุบัน UTF-8 ใกล้ชิดกับตัวเรามากที่สุด โดยที่เราไม่รู้ตัว ยกตัวอย่างเช่น ชื่อไฟล์ภาษาไทยที่อยู่บน
Windows XP นั้นก็เป็น UTF-8 อยู่แล้ว แต่เรายังไม่รู้ตัว, Google ก็ทำงานแบบ UTF-8 โดยที่เราไม่รู้ตัว
บางคนที่ใช้ Gmail อาจโทษว่า "Gmail ไม่รองรับภาษาไทย ส่งให้คนอื่นอ่านแล้วอ่านไม่ออก" ตรงนี้บอกได้เลยครับว่า
ไม่ต้องโทษ Gmail หรอกครับ ต้องโทษระบบอีเมล์ที่ไม่ยอมทำความรู้จักกับ UTF-8 น่าจะถูกต้องกว่า
อุปกรณ์ต่างๆ ไม่ว่าจะเป็นมือถือที่เป็น OS Symbian, Pocket PC เค้าก็ใช้ UTF-8 กันแทบทั้งสิ้น
ตอนนี้มีเพียงคำถามเดียวครับว่า เรายังจะยึดติดอยู่ที่ TIS-620 ไปตลอดหรือ ?
หากใครยังชั่งใจอยู่ในเวลานี้ ก็ศึกษาข้อมูลเพิ่มเติมได้ก่อนที่จะเปลี่ยนแปลงจริงๆ จังๆ อีกที
เริ่มต้นกับ UTF-8
มีคำถามมากมายเกี่ยวกับ UTF-8 ผมขอแยกเป็นข้อๆ ในส่วนของข้อดีและข้อเสีย
แล้วลองพิจารณาดูนะครับว่า ขณะนี้เราพร้อมแล้วหรือยังกับ UTF-8
ข้อดีของ UTF-8 กับ TIS-620
- รองรับได้หลายภาษา แน่นอนที่สุดสำหรับผมเลือกใช้เพราะสาเหตุนี้
- ภาษาโปรแกรมมิ่งทั้งหลายรองรับ UTF-8
- เข้ากันได้ดีกับรหัส ASCII
- การแปลงเป็น Charset ชนิดอื่นไม่ยุ่งยากโดยใช้ ICONV
- สามารถเรียงลำดับอักษรภาษาไทยได้ 100% ไม่มีผิดเพี้ยน
ข้อเสียของ UTF-8 กับ TIS-620
- มีปัญหาการทำงานกับฟังก์ชั่นในบางภาษา
- ภาษาไทยไม่ได้มีเพียงแค่ TIS-620 (มีทั้ง CP874, MacThai)
อ้างอิงจาก
http://www.gnu.org/software/libiconv/ - เสียเวลาในการเขียนโปรแกรมแปลงฐานข้อมูล และไฟล์ให้เป็น UTF-8
- การออกแบบฐานข้อมูล (Field) ต้องไม่ยึดติดกับความกว้างตัวอักษรแบบเดิม เพราะ UTF-8 จะเก็บเป็น Byte
สรุปคือต้องขยายความกว้าง Field เกือบทุก Field ที่เป็น Varchar เพื่อรองรับ UTF-8
ปัญหาสำหรับนักพัฒนาภาษา PHP กับ UTF-8
การปรับมาใช้ UTF-8 นั้นก็เป็นปัญหาสำหรับโปรแกรมเมอร์เหมือนกัน โดยตัวอย่างที่ผมจะอธิบายต่อไปนี้
ก็ขออ้างอิงถึงภาษา PHP ครับ เพราะปัจจุบันผมก็เขียนโปรแกรมกับภาษานี้อยู่ ซึ่งปัญหาหลักๆ เกิดจาก
การเขียนโปรแกรมแล้วเลือกใช้บางฟังก์ชันไม่ได้ หรือต้องปรับแก้โปรแกรมหรือใช้ฟังก์ชันที่รองรับ UTF-8
ฟังก์ชันที่มีปัญหากับ UTF-8 ในภาษา PHP อ่านรายละเอียดเพิ่มเติมได้ที่
http://www.phpwact.org/php/i18n/utf-8โดยแต่ละฟังก์ชันจะมีการแจกแจงผลกระทบตั้งแต่ระดับ สูง - กลาง - ต่ำ ละเอียดดีครับ
พร้อมแล้วหรือยังที่จะแปลงระบบโปรแกรมและฐานข้อมูลเป็น UTF-8 ?
ข้อนี้ต้องถามตัวเองแล้วครับว่าพร้อมแล้วหรือยัง ส่วนผมพร้อมแล้วและก็ทำไปแล้ว
ท่องไว้ครับคำนี้นะ "อย่ายึดติดกับระบบเดิมๆ" ปัญหาต่างๆ เหล่านี้สามารถแก้ไขได้ครับ
เพราะว่าบางฟังก์ชันเราก็เขียนขึ้นมาใหม่ แทนที่ฟังก์ชันเดิมที่ไม่รองรับ UTF-8
ว่าแล้วก็แจกโปรแกรมแปลงเลยครับ โดยในโปรแกรมจะมีตัวอย่างฟังก์ชัน substr_utf8 ที่เขียนขึ้น
โดยสามารถรองรับ UTF-8 แทนฟังก์ชัน substr เดิมที่มีอยู่
โปรแกรมแปลงระบบเป็น UTF-8
1. โปรแกรมแปลงฐานข้อมูล MySQL จาก TIS-620, CP874, MacThai เป็น UTF-8
2. โปรแกรมแปลงไฟล์ จาก TIS-620,CP874,MacThai เป็น UTF-8
ดาวน์โหลดได้จาก :
http://prdownloads.sourceforge.net/appserv/appserv-Tis2utf8-1.0.zip?download** หมายเหตุ **
โปรแกรมที่แจกไม่ใช่ Freeware ไม่ใช่ Shareware แต่เป็น Open Source นะครับ
สงวนลิขสิทธิ์ในรูปแบบ GPL สรุปคือเอาไปใช้กันได้เลยครับไม่ต้องคิดมาก
และที่สำคัญโปรแกรมอาจจะมี Bug บ้าง ใครแก้ Bug แล้วกรุณาส่งกลับมาด้วยครับ
เผื่อจะได้แจกจ่ายให้กับคนอื่นๆ อีกต่อไปครับ ตอนแก้ใส่ Credit มาด้วยนะครับว่าแก้ตรงไหน
โปรแกรมนี้ สามารถแปลงจาก Charset ไหนๆ ก็ได้ในโลก ไปเป็น Charset ไหนๆ ก็ได้อีก
ทำได้โดยแก้ไข Source Code กันเอาเองนะครับ ถ้าอยากแปลงเป็นอย่างอื่น
วิธีการใช้งานต่างๆ มีอยู่ในไฟล์โปรแกรมแล้วครับลองเปิดดู
ข้อมูลอ้างอิง TIS-620
-
http://www.nectec.or.th/it-standards/std620/std620.htm-
http://software.thai.net/tis-620/index.html-
http://linux.thai.net/~ott/docs/tis-620.html-
http://en.wikipedia.org/wiki/TIS-620หลายๆ คนมีความเข้าใจว่า MySQL ตั้งแต่รุ่น 5.0.x เป็นต้นไป มีปัญหาในการใช้ภาษาไทย ผมทดลองหาวิธีแก้ไขปัญหาไว้เล็กน้อยครับตอนที่จะ upgrade Server ในภาควิชา ก็มีความกังวลกันว่า ต้องเปลี่ยนไปใช้ MySQL Server รุ่นใหม่ๆ ที่หลายๆ คนลือกันว่า มีปัญหาเรื่องภาษาไทย และ database เดิมที่มักจะเขียนด้วย tis-620 (หรือที่หลายคนอาจจะเข้าใจว่า เป็น latin) ซึ่งเป็นรหัสภาษาไทย(character set) ชนิด 8 บิท
มีการสอบถามผู้ที่ คาดว่า จะรู้ หรือผู้ที่ดูแลระบบไอที ก็ไม่ค่อยได้รับคำตอบว่า จะแก้ไขปัญหาอย่างไร ส่วนใหญ่ก็แนะนำไปว่า ก็ใช้ MySQL Server รุ่นเดิมไปก่อน
ลองค้นหาใน website ก็พบว่า มีคนเขียนไว้เหมือนกัน แต่อ่านแล้วอ่านอีกก็ไม่เข้าใจถ่องแท้สักทีครับ ลองอ่านดูที่คุณ ต้มยำกุ้ง นำมาให้อ่านดูก็ได้ครับ นั่นก็เป็นตัวอย่างหนึ่งครับ สำหรับผู้ผู้ที่รู้เรื่องเกี่ยวกับ character set และ encoding แล้วก็อาจจะเข้าใจได้ไม่ยาก แต่คนที่ไม่มีพื้นฐานเกี่ยวกับสิ่งเหล่านี้เลย อ่านหลายๆ รอบก็ไม่เข้าใจครับ
ผมลองอ่านดูที่บางคนเขียนไว้ รวมทั้งสอบถามกูรูไอทีบางคนอธิบาย ก็ยังงงๆ เหมือนเดิม สุดท้ายต้องลงมือทำดู จึงได้เข้าใจขึ้นมาบ้าง
ต้องบอก ว่า ระหว่างที่ลองทำดูก็ยังมีความเข้าใจที่เป็นการเข้าใจผิดเหมือนกันครับ และที่ผมจะบันทึกไว้ต่อไปนี้ ก็อาจจะไม่ถูกต้องทั้งหมดก็ได้ครับ
ข้อเท็จจริงที่ผมพบ คือ
MySQL Server รุ่นไหนๆ ก็รองรับการใช้ภาษาไทย (รวมทั้งภาษาอื่นๆ ด้วย) โดยเฉพาะรุ่นที่รองรับ character set utf-8 จะมีข้อดีมากๆ คือ สามารถใช้ได้หลายภาษา
ควรเลือกใช้ phpMyAdmin รุ่นประมาณ 2.6.x-2.7.x (ผมไม่แน่ใจว่า รุ่น 2.8-2.9 เป็นอย่างไร แต่รุ่น 2.10-2.11 ควรหลีกเลี่ยงสักพักก่อน)
โดย default แล้ว MySQL Server จะตั้งค่า character set ไว้ค่อนข้างพิลึก หากดูจาก phpMyAdmin ให้คลิกที่ Show MySQL system variables จะพบส่วนที่เกี่ยวกับ cahracter set และ collation (สำหรับการเรียงลำดับ) หลายตัวครับ บางตัวก็เป็น utf8 บางตัวก็เป็น latin1 ส่วนที่เป็นปัญหา คือ ส่วนที่ระบุเป็น latin1 เพราะเป็น character set ที่รองรับรหัสภาษาเพียง 8 บิทเท่านั้น
การแก้ปัญหาก็เลยต้องปรับทุกตัวให้เป็น utf8 เสีย โดยการแก้ไขไฟล์ /etc/mysql/my.cnf ด้วยการเพิ่ม
default-character-set=utf8
เข้า ไปที section ของ [client] และ [mysqld] จากนั้น ก็ restart ด้วยคำสั่ง sudo /etc/init.d/mysql restart (สำหรับ Ubuntu หรือ Debian) จากนั้น system variables อีกครั้ง จะพบว่า character set เป็น utf8 ทั้งหมด
วิธี การ port ข้อมูลเดิมไปใส่ในฐานข้อมูลบน MySQL Server ตัวใหม่ต้องมีความเข้าใจว่า เดิมฐานข้อมูลใช้ character set ใด และต้องการ port ไปใน Server ตัวใหม่ให้เป็น character set ใด หากเดิมเป็น tis620 และต้องการให้เป็น tis620 เหมือนเดิม ให้ตั้งค่าในข้อ 4 เป็น default-character-set=tis620 แทนที่จะเป็น utf8 ครับ แล้วก็ port ข้อมูลที่ dump ไว้เข้าไป ก็จะไม่มีปัญหาครับ
แต่หากเดิมเป็น tis620 และต้องการแปลงเป็น utf8 ในฐานข้อมูลใหม่ วิธีที่ผมใช้ก็คือ
ตั้งค่าในข้อ 4 เป็น default-character-set=utf8
แปลง character set ในฐานข้อมูลจาก tis620 เป็น utf8 ด้วยคำสั่ง
iconv -f tis620 -t utf8 source_file >dest_file
จากนั้น ก็ import เข้าฐานข้อมูลใหม่ ก็ใช้ได้เลยครับ
อีกวิธีที่ไม่ต้องไปยุ่งกับการตั้งค่าใน my.cnf และการมาแปลง character set ในไฟล์เอง ก็คือ บอก mysql client ให้ทราบว่า ไฟล์ต้นทางเป็น character set แบบใด เช่น
สมมติว่า ไฟล์ฐานข้อมูลที่ dump มาชื่อ mydb.sql มี character set เป็น tis620 และเราต้องการ import เข้าไปใน MySQL Server ให้เป็น utf8 เราก็สามารถใช้คำสั่ง mysql ดังนี้
mysql --default-character-set=tis620 mydb <mydb.sqlคำสั่งข้างต้นนี้ได้ละ options บางส่วนไว้ ขึ้นกับการตั้งค่าใน Server ของแต่ละคนครับ