NetplusHost Hosting Reseller and Domain
| วิธีแก้ปัญหา charset ของ MySQL กับปัญหาภาษาไทยอ่านไม่ออก ???? |
|
ทำความเข้าใจกับปัญหา charset ของ MySQL ก่อนอื่นมาทำความเข้าใจกับระบบ 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) --- ภาษาไทยถูกต้อง วิธีแก้ปัญหา เรื่องการ import mysql database แล้วอ่านภาษาไทยไม่ได้ นี่คือข้อมูลตัวอย่างในไฟล์ดาต้าเบสที่จะนำไป Import เข้า phpmyadmin นะครับ CREATE TABLE `web_page` ( `id` int( 11 ) NOT NULL auto_increment, `username` varchar( 50 ) NOT NULL default '''', `password` varchar( 50 ) NOT NULL default '''', `name` varchar( 255 ) NOT NULL default '''', `email` varchar( 100 ) NOT NULL default '''', `level` tinyint( 4 ) NOT NULL default ''0'', KEY `id` ( `id` ) ) ENGINE = MyISAM DEFAULTCHARSET = tis620 AUTO_INCREMENT = 8 แล้วมักจะเจอปัญหาว่า import เข้าโฮสไม่ได้ วิธีแก้ก็คือ ให้เปลี่ยน ENGINE = MyISAM เป็น TYPE = MyISAM แล้วก็ค่อยนำไป import เข้า phpmyadmin นะครับ แค่นี้ก็ใช้งานได้แล้วครับ ส่วน import แล้วเป็น ?????? วิธีแก้ก็คือตอน Import เข้า phpmyadmin ให้เลือกโหมดการ import เป็น Tis-620 นะครับ และ/หรือ ให้เพิ่มคำสั่งตามตัวอย่างดังต่อไปนี้ เข้าไปใน Script ที่มีการ qurey ข้อมูล mysql_query("SET NAMES TIS620"); mysql_query("SET character_set_results=tis620"); แค่นี้ก็ใช้งานได้แล้วครับ |

