แก้ปัญหา charset ของ mysql กับปัญหาภาษาไทยอ่านไม่ออก?

กระทู้นี้มีประโยชน์มากๆ

ขอบคุณครับ

:slight_smile:

ขอถามนิดนึงครับ
ในกรณีที่เว็บไซต์ เก็บเป็น utf8 และ export ผ่าน (phpmyadmin 2.5 / mysql 4.0) ออกมาเป็น tis620 ผลคือ เมื่อเปิดดูด้วย editplus จะอ่านภาษาไทยไม่ออกครับ

คำถามคือ หาก นำกลับไป import อีกที่นึง เป็น mysql 4.1 และ phpmyadmin 2.7-2.10 ใน case นี้ควรเลือก collation และ charecter เป็นอะไรครับ

ในส่วนที่ผมทดลองคือ
1 ผมนำ file ที่ export ออกมาแล้วอ่านไม่ออกผมลอง import เลือกเป็น collation เป็น latin

หมายความว่า แม้แต่เลือกเป็น utf8 เหมือนเดิม ก็ไม่ได้หรือครับ

เน่าไปแล้วครับ DB ผมเอามาเปิดด้วย Edit Plus ทำยังไงก้อไม่เป็นไทยแล้ว

[quote author=mean link=topic=6764.msg63474#msg63474 date=1181275601]
ขอถามนิดนึงครับ
ในกรณีที่เว็บไซต์ เก็บเป็น utf8 และ export ผ่าน (phpmyadmin 2.5 / mysql 4.0) ออกมาเป็น tis620 ผลคือ เมื่อเปิดดูด้วย editplus จะอ่านภาษาไทยไม่ออกครับ

คำถามคือ หาก นำกลับไป import อีกที่นึง เป็น mysql 4.1 และ phpmyadmin 2.7-2.10 ใน case นี้ควรเลือก collation และ charecter เป็นอะไรครับ

ในส่วนที่ผมทดลองคือ
1 ผมนำ file ที่ export ออกมาแล้วอ่านไม่ออกผมลอง import เลือกเป็น collation เป็น latin

มาดูตัวอย่างกันครับ

จากระบบเดิม mysql 4.0
ภาพ 1. เก็บแบบ utf8 ในฐานข้อมูล mysql 4.0 ซึ่งเป็น ascii ก็จะเห็นใน phpmyadmin (2.5) เป็นตัวแปลกๆอ่านไม่ออก
ภาพ 2. เมื่อ export ออกมาเป็น .sql เปิดดูด้วย editplus ก็จะเห็นเหมือนกับใน phpmyadmin

มาที่ระบบใหม่ mysql 4.1 up
ภาพ 3. เมื่อสร้าง Database ขึ้นมาใหม่ผ่านหน้า cp แล้วเปิดดูด้วย phpmyadmin (>2.7) ไปที่หน้า operation จะเห็นค่า default ว่าเป็น collation อะไร ในที่นี้เป็น latin1
ภาพ 4. ทำการ import ไฟล์ sql (ที่ไม่ได้แก้ไขอะไรเลย) ลงในฐานข้อมูลที่เป็น latin1 ดู
ภาพ 5. จะเห็นว่าตารางจะถูกสร้างขึ้นเป็น collation เดียวกับ database
ภาพ 6. เมื่อเปิดดูข้อมูลที่ import มาจะเป็น ?? ?? (เมื่อเปิดด้วย phpmyadmin 2.5 ก็จะเห็นเป็น ?? ?? เช่นเดียวกัน)
ภาพ 7. ให้ drop table ทิ้งไป แล้วไปที่หน้า operation ใหม่ คราวนี้เปลี่ยนเป็น utf8 แล้วคลิก go
ภาพ 8. ทำการ import เหมือนกับในข้อ 4 ทุกประการ แต่คราวนี้ database เราแก้เป็น utf8 ไว้แล้ว
ภาพ 9. ตารางจะถูกสร้างขึ้นเป็น utf8 ตามค่าของ db ที่ตั้งในภาพ 7 เมื่อเปิดดูข้อมูลก็จะพบว่าเป็นภาษาไทยอ่านออกปกติ (แต่เมื่อเปิดด้วย phpmyadmin 2.5 ก็จะยังเห็นเป็น ?? ??)

ทั้งนี้เมื่อฐานข้อมูลเราเก็บเป็น utf8 ในการ query ข้อมูลเราต้องมั่นใจว่า
ได้ทำการ connect db ใน collation utf8 ตรงกันกับข้อมูล
และการแสดงผลหน้าเวบ browser ก็จะต้องเลือก encoding เป็น utf8 ด้วยเช่นกัน
หากในไฟล์ my.cnf ของทางโฮสมีการระบุ default collation เอาไว้ไม่ตรงกับที่เราใช้
เราจะเป็นต้องกำหนดเองในไฟล์ php ที่ทำการ connect db ด้วยการเพิ่ม query set name เข้าไป

$dbres = mysql_connect(host, user, password);
mysql_query("SET NAMES UTF8", $dbres);

เหตุการณ์เมื่อปีก่อน
ทีแรกผมก็เจอปัญหานี้ครับ เริ่มแก้ php.ini
ผมได้ทำการ Set หลายอย่างแล้วก็ไม่ได้

[client]

port=3306

default-character-set=tis620

และ ที่

[mysqld]
default-character-set=tis620

ไม่หายครับ ยังเป็น ???
ลงดาต้าเบสใหม่ ไม่หาย
ลง OS ใหม่เลย ( Debian ) ไม่หาย

เริ่มกระอัก เลยไปดูที่ mysql.org เลยรู้ว่า MySql เวอร์ชั่น ตั้ง แต่ 4.1 ขึ้นมา เนื่องจาก ทาง MySql ได้เปลี่ยนรูปแบบ การ เก็บ ข้อมูล ที่ เป็นอักขระ ใหม่ จาก เวอร์ชั่นเดิม ทำให้ การเก็บและ แสดงผล ของ บางภาษา เช่น thai เป็น ???
เราสามารถ แสดง Character Set Support ได้ด้วย
SHOW VARIABLES LIKE ‘character%’;

ก็เลยรู้ว่าสาเหตุที่แท้จริง การแก้ปํญหาแบบเวอร์ชั่น 4.0 จึงไม่ได้ ยิ่งเอาข้อมูลเดิมมาลงยิ่งแล้วเลย

ทางแก้คือ

  1. ลงดาต้าเบสเวอร์ชั่นเก่า
  2. ไปลงดาต้าเบส version 5.xx เลย
  3. อันนี้พอแกะ help ใน mysql เพิ่งหัวเราะทั้งน้ำตา กรูโง่ตั้งนานแค่

Query : “SET NAMES ‘tis620’”; หลังจาก connect กับดาต้าเบสไป 1 ที แสดงผลถูกต้อง !!!

ปล. อันนี้ใช้กับ PHP
$charset = “SET NAMES ‘tis620’”;
mysql_query($charset) or die('Invalid query: ’ . mysql_error());

ลองดูครับ ผมทำแค่นี้เอง

พอดีไปเจออันนี้มากด้วย

http://www.itwizard.info/technology/MySQL/MySQL_with_thai.html

ลองดูครับ เผื่อจะถูกใจ

ต้องดูที่ server collation ด้วยครับถ้าเป็นชุดอักขระที่มีขนาดเล็กกว่า แต่เอาชุดอักขระที่มีขนาดใหญ่กว่าไปใส่ก็จะมีปัญหา เช่น เอา utf ไปใช้ใน latin1 ซึ่งถึงแม้จะตั้ง database, table และ field collation เป็น utf แล้วแต่ถ้า server เป็น latin ก็จะถูกบีบเหลือเป็น latin ครับ

ถ้าผมจะนำ db จาก

phpMyAdmin - 2.9.0.2

MySQL client version: 4.1.10

MySQL charset:

[quote author=upkajuy link=topic=6764.msg63557#msg63557 date=1181302535]
ถ้าผมจะนำ db จาก

phpMyAdmin - 2.9.0.2

MySQL client version: 4.1.10

MySQL charset:

แล้วถ้า จาก
phpMyAdmin 2.5.4

MySQL 4.1.21-standard-log

ย้ายมาที่

phpMyAdmin 2.10.1
MySQL 5.0.41
ละ ครับ

ลงแล้วครับพี่ dump ไม่ผ่าน ใช้ bigdump เช่นเคย

ทำการ force connection เป็น utf8 ด้วยครับ

หัวใจสำคัญอยู่ที่ charset / collation ของ db ครับ ไม่ใช่ version
ดังนั้นต้องดูด้วยว่าเดิมเป็น
charset อะไร เก็บอยู่ใน collation อะไร
แล้วมาโฮสใหม่ default เป็น collation อะไร ต้องแก้ให้ตรงกับของเราก่อน import หรือเปล่า

สำหรับ 4.1 กับ 5.0 มันรองรับ unicode เหมือนๆกัน
ดังนั้นจริงๆแล้วหากหา phpmyadmin เวอร์ชั่นสูงกว่า 2.7 มา export ในที่เดิมได้
ก็สามารถนำมา import ผ่าน phpmyadmin 2.10 ได้เลยทันที (แต่อาจต้องแก้ collation ของ db ก่อน)

ถ้าจะย้ายจาก

phpMyAdmin - 2.9.0.2
MySQL client version: 4.1.21

ไปที่

phpMyAdmin - 2.10.0
MySQL client version: 4.1.10

ทำยังไงให้เป็นภาษาไทยครับ
ขอบคุณครับ

ที่เก่าก็ใช้ phpmyadmin เปิดดูก่อนครับว่าเป็น database กับ table เป็น collation อะไร
มาที่ใหม่ก็สร้าง db แล้วเปลี่ยน collation ให้เหมือนของเก่าก่อนครับ ค่อยทำการ import
อีกอย่างที่ต้องพิจารณาคือ default charset / collation ในไฟล์ my.cnf ที่ทางโฮสตั้งไว้
ซึ่งคนละโฮสอาจจะตั้งไว้ไม่เหมือนกัน วิธีดูง่ายๆก็คือสร้าง db ขึ้นมาใหม่ผ่าน cp แล้วก็
เข้าไปดูผ่าน phpmyadmin ว่า db ที่สร้างนั้นเป็น collation อะไร นั่นคือ default ของทางโฮส
หากไม่ตรงกับที่เราใช้ก็ให้เปลี่ยน collation ของ db ก่อนทำการ import เท่านั้นเอง
และถ้าจะให้ชัวร์ก็ไปเพิ่ม คำสั่ง query “SET NAMES ‘charset’” หลังจาก connect db
โดยแทน charset ด้วย charset ที่เราต้องการใช้งาน

อันนี้ทำยังไงครับ

ถ้าจะให้ชัวร์ก็ไปเพิ่ม คำสั่ง query “SET NAMES ‘charset’” หลังจาก connect db
โดยแทน charset ด้วย charset ที่เราต้องการใช้งาน

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

ใครก็ได้ช่วยผมที

pm รายละเอียดมาครับ ว่างๆจะเข้าไปดูให้
ip เครื่องเก่า
url ของ phpmyadmin
login+passwd