รับรองว่าหลายๆคนต้องเคยเจอปัญหากับภาษาไทยเป็นเครื่องหมายคำถาม ?? กันมาแล้ว
ซึ่งสาเหตุมีเพียงเรื่องเดียวคือเรื่องของ charset ของ database
แต่เอ๊ะ ทำไมแก้ยังไงก็ไม่ได้ซะที ทั้งๆที่โฮสเก่าก็ใช้ได้ แต่โฮสใหม่ก็ทำเหมือนๆกันแต่ใช้ไม่ได้
มาดูกันครับว่าอะไรเป็นอะไร
เริ่มต้นตั้งแต่การติดตั้ง mysql
ในการติดตั้ง mysql-server นั้นหากไม่มีการระบุ charset ใดๆ ก็จะมี default charset เป็น latin1_swedish_ci หากมีการระบุตอน compile ก็จะเป็น charset ตามที่ระบุไว้
อย่างไรก็ดีค่า default-charset สามารถเปลี่ยนแปลงภายหลังได้โดยการระบุไว้ในไฟล์ my.cnf
เมื่อเราทำการสร้าง database ใหม่ database ก็จะมี charset ตามค่า default ในไฟล์ my.cnf หรือถ้าใน my.cnf ไม่มีการระบุก็จะเป็นค่า default ตอน compile
compile php with mysql
ในการ compile php นั้นเราจะต้อง configure --with-mysql=path เมื่อ compile เสร็จแล้ว สิ่งที่ได้รับคือ php จะทำการ connect mysql ด้วย charset ตามค่า default charset ของ mysql lib ซึ่งจะไม่สามารถเปลี่ยนได้ด้วย my.cnf หรือ php.ini
การตั้งค่าและการใช้งาน
แบบที่ 1
– compile mysql เป็น default charset latin1
– ไม่มีการกำหนด default charset ใน my.cnf
– สร้าง database ใหม่ก็จะได้ charset เป็น latin1
– เวลาใช้งาน php ก็ connect ด้วย charset latin1 ตาม mysql lib
– ผลลัพธ์คือ การเก็บข้อมูลแบบ ascii ในตารางแบบ ascii
– การใช้งานหน้าเว็บ ปกติ (encoding tis-620 หรือ windows-874)
– phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็นภาษาไทย
– phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ascii encoding iso-8559-1
แบบที่ 2
– compile mysql เป็น default charset latin1
– แล้วกำหนด default charset ใน my.cnf เป็น utf8
– สร้าง database ใหม่ก็จะได้ charset เป็น utf8 ตาม my.cnf
– แต่เวลาใช้งาน php ดัน connect ด้วย charset latin1 ตาม mysql lib
– ผลลัพธ์คือ การเก็บข้อมูลแบบ ascii ในตารางแบบ unicode
– การใช้งานหน้าเว็บ ปกติ (encoding tis-620 หรือ windows-874)
– phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็นภาษาไทย
– phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ascii encoding iso-8559-1
แบบที่ 3
– compile mysql เป็น default charset utf8
– กำหนดหรือไม่กำหนด default charset ใน my.cnf เป็น utf8 ก็ได้
– สร้าง database ใหม่ก็จะได้ charset เป็น utf8
– เวลาใช้งาน php ก็ connect ด้วย charset utf8 ตาม mysql lib
– ผลลัพธ์คือ การเก็บข้อมูลแบบ unicode ในตารางแบบ unicode
– การใช้งานหน้าเว็บ ปกติ (encoding utf-8)
– phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็น ??
– phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ภาษาไทย
แบบที่ 4
– compile mysql เป็น default charset utf8
– กำหนดหรือไม่กำหนด default charset ใน my.cnf เป็น utf8 ก็ได้
– สร้าง database ใหม่ก็จะได้ charset เป็น utf8
– เวลาใช้งาน php ก็ connect ด้วย charset utf8 ตาม mysql lib
– ผลลัพธ์คือ การเก็บข้อมูลแบบ unicode ในตารางแบบ unicode
– การใช้งานหน้าเว็บไปใช้กับระบบที่เป็น encoding tis-620
– phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็น ??
– phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ภาษาไทย
หมายเหตุ: แก้ encoding หน้าเว็บเป็น utf-8 ก็จะใช้งานได้ปกติ แต่จริงๆคือการเอา script แบบ ascii มาใช้ในระบบ unicode ผลที่จะตามมาคือขนาดของ field ในแต่ละตารางจะกำหนดไว้สั้นเกินไปเนื่องจาก utf-8 ใช้เนื้่อที่มากกว่าแบบ ascii 3 เท่า
แบบที่ 5
– compile mysql เป็น default charset latin1
– แล้วกำหนด default charset ใน my.cnf เป็น utf8
– รวมถึงกำหนด init ใน my.cnf เป็น utf8 ด้วย
init-connect='SET collation_connection = utf8_general_ci'
init-connect='SET NAMES utf8'
– สร้าง database ใหม่ก็จะได้ charset เป็น utf8 ตาม my.cnf
– และเวลาใช้งาน php จะ connect ด้วย utf8 ตาม init-connect ใน my.cnf
– ผลลัพธ์คือ การเก็บข้อมูลแบบ unicode ในตารางแบบ unicode
– การใช้งานหน้าเว็บ ปกติ (encoding utf-8)
– phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็น ??
– phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ภาษาไทย
ขอแสดงตัวอย่างแค่ 5 แบบที่น่าจะพบมากที่สุดพอครับ
ผลกระทบ
ในแต่ละแบบจะเห็นว่าระบบจะบังคับการใช้งานไปใน charset ใด charset หนึ่ง ซึ่งหากต้องการใช้งานระบบที่ต่างจาก default charset