การตั้งค่า MySQL แก้ปัญหา ภาษาไทย กลายเป็น ? หรือ อ่านไม่ออก

รับรองว่าหลายๆคนต้องเคยเจอปัญหากับภาษาไทยเป็นเครื่องหมายคำถาม ?? กันมาแล้ว
ซึ่งสาเหตุมีเพียงเรื่องเดียวคือเรื่องของ 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

สุดยอดความรู้ดีๆ ครับ

ขอบคุณมากครับ

ขอบคุณครับ

lol

ขอบคุณครับ

แล้วพวก Mambo ที่เวลาจะโพสบทความใหม่ๆก็เป็น ??? จะ แก้ยังงัย ครับแบบนี้

mambo ต้องแก้ config ของ mambo เองครับ

mambo ต้องแก้ config ของ mambo เองครับ

แก้ ยังงัย ครับ ผมลองดูใน template แล้วก็ยังไม่ได้ครับ รบกวนด้วย

ขอบคุณครับ

ช่วยกันโปรโมทการเผยแพร่ความรู้นะครับ ขอบคุณครับท่านแมน

แก้ไขเรียบเรียงใหม่ครับ น่าจะกระจ่างกว่าเดิมเยอะเลยครับ

ขอบคุณครับ แต่ก่อนเวลาเจอปัญหาแบบนี้ ก็เอาเหงื่อตก น้ำลายเหนียวเลยเหมือนกัน. เหนื่อยเลย :sleep:

คุณแมนว่างๆ มาอัพเดตกระทู้ดีๆ นี้หน่อยเร้ว

โอ้มะกี้นั่งทำเว็บ ระบบสมาชิก นั่งงมโข่งตั้งนาน 555+ ทำได้และ ขอบคุณมากครับ

เครื่องผมทุกเครื่องจะไม่ไป lock init_xxx ไว้ใน my.cnf ครับ

ปล่อยเป็น latin1 ใช้งาน default เป็น ascii กับหน้าเว็บที่ encode windows 874 / tis620 ได้ปกติครับ

ส่วน database ที่ใช้ระบบ utf8 ส่วนมาก script มันก็จะมี query “set name utf8” มาให้ใน code อยู่แล้ว ก็จะใช้งานได้ปกติ

ส่วนพวกที่เขียน code เองก็แค่ไปเพิ่ม query บรรทัดเดียวก็ใช้งานได้แล้ว จึงไม่มีปัญหาครับ

จะมีปัญหาก็ตอนที่ import / export จากคนละเครื่องที่ต่าง charset กันเท่านั้นครับ

จริงๆอยากทำใน my.cnf แต่เนื่องจากมีข้อมูลลูกค้าหลายคนที่เก่ามากๆ ตั้งแต่สมัยย้ายเซิฟเวอร์มาเลยต้องกำหนดใน my.cnf ไว้

default-character-set=latin1

init-connect = ‘SET NAMES latin1’

เลยต้องเวลา connect mysql เขียนสคริปเพิ่มเข้าไปอีกสองบรรทัด อิอิ

mysql_query(“SET collation_connection = tis620_thai_ci”);

mysql_query(“SET NAMES tis620”);

หลังๆมาเริ่มเปลี่ยนไปใช้ UTF-8 แล้ว เพราะซักวัน tis-620 ความนิยมก็ต้องน้อยลง เลยถือโอกาสค่อยๆทำตัวให้ชินกับ UTF-8 ไปในตัว

สุดยอดจริง ๆ เขียนใหม่ ๆ ก็เจอปัญหานี้เหมือนกัน

ยอดเยี่ยมมากครับคุณแมน +1 จากใจ

ขอบคุณมากๆท่าน เจอบ่อย phpnuke กะ wordpress ดึกดำบรรพ์ลูกค้าให้ย้ายมา server ใหม่

เพิ่งย้าย ipb ครับ ปวดหัวเลยที่เดิมเป็น latin1 export ออกมาใช้ไม่ได้เลย. กว่าจะแก้เสร็จเล่นเอาเหนื่อยเลย

อยากให้ทุกที่บันทึกเป็น utf8 หมดครับจะได้โอนย้ายข้อมูลกันได้ง่าย