May 16, 2011

ปัญหา Classic MySQL ,PHP5 และ ภาษาไทย

เขาบอกว่า ปัญหามาจาก ความไม่เข้าใจใน MySQL 5.x,4.x และ PHP 5

ปัญหาที่พบจนเป็นปัญหา classic คือ เวลาดึงฐานข้อมูลขึ้นมาจาก MySQL จะเจอแต่เครื่องหมายแบบนี้
???????????????????????????????????????????
?????????????????????????????????????????

เขาบอกว่า ไม่ใช่ปัญหา แต่เราต้องทำความเข้าใจใหม่กับ เวอร์ชั่นใหม่นี้

ดังนั้น การ Query ข้อมูลที่เป็น TIS-620 จะต้องเพิ่มส่วนนี้เข้าไปใน code ทุกครั้งที่มีการ connect
mysql_db_query($dbname,"SET NAMES tis620");
หรือจะทำให้ Default ของ MySQL ทั้งหมดเป็น TIS-620 ไปเลย ก็ให้แก้ไขที่ my.cnf ดังนี้
ในส่วนของ [client] ให้เพิ่ม
default-character-set = tis620
ในส่วนของ [mysqld] หลัง database directory ให้เพิ่ม
default-character-set = tis620
character-set-server = tis620
collation-server = tis620_thai_ci
init_connect = 'SET collation_connection = tis620_thai_ci'
init_connect = 'SET NAMES tis620'

จากนั้น Restart MySQL
แต่ ในทางกลับกัน ผู้ที่ใช้ UTF-8 ก็จะมีปัญหาเวลา query เพราะเรา set ทุกอย่างให้เป็น tis620 ไปซะหมด
เพราะฉะนั้น ผู้ที่ใช้ UTF-8 ก็จะต้องใน code ทำนองเดียวกัน ทุกครั้งเวลา connect database
mysql_db_query($dbname,"SET NAMES UTF8");
Character set

เมื่อก่อนเป็น Character Set แบบปลอมๆ คือข้อมูลต่างๆที่เก็บลงฐานข้อมูลมันคือ latin1 นั่นเอง
แล้วทำไม Latin1 มันใช้ภาษาไทยได้หละ แน่นอนอยู่แล้วมันใช้ได้เนื่องจาก latin1 มัน Key map แบบเดียวกะ keyboard ไทย และประเทศอื่นๆ ก็เป็น Key Map เดียวกัน แต่สมัยนี้พวกภาษาจะไม่ขึ้นอยู่กับ Key Map ที่เราเห็นอยู่แล้ว (UTF-8)
*** และที่สำคัญในเวอร์ชั่น 4.0, 3.x มีให้เลือก character set ตรงนั้นไม่ได้มีความหมายว่า เก็บข้อมูลเป็นภาษาไทย
ความหมายของมันคือ เรืยงลำดับภาษาไทยต่างหาก คนไทยจึงเข้าใจผิดๆ มานาน -_-' กับ tis620 ใน MySQL
ไม่ก็ลองย้อนไปดูได้ครับแม้ว่าจะเลือก charset เป็น latin1 มันก็เก็บข้อภาษาไทยได้ เพียงแต่เรียงลำดับภาษาไทยไม่ได้เท่านั้น

ทำความเข้าใจ ระดับภาษาของ MySQL กันใหม่ เพราะ MySQL เวอร์ชั่นใหม่มีความยืดหยุ่นมากขึ้น
- ต้องกำหนดภาษาเมื่อ Connect to Database
- ต้องกำหนดภาษาเมื่อ Create Database (การเรียงลำดับ)
- ต้องกำหนดภาษาเมื่อ Create Table (การเรียงลำดับ)
- ต้องกำหนดภาษาเมื่อ Create Field (การเรียงลำดับ)
สรุปแล้ว ใช้ UTF-8 กันดีกว่าครับ ไม่มีปัญหา เป็น Character set ที่ใช้กับทุกภาษา ส่วนคนที่ใช้ TIS-620 ก็เพิ่ม code กันเองเองนะคร้าบ

No comments:

Post a Comment