สิงหาคม 19, 2019, 07:10:56 PM *
ยินดีต้อนรับคุณ, บุคคลไม่รู้ว่าใคร กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
หน้า: [1]   ลงล่าง
  พิมพ์  
เมื่อภาษาไทยกลายเป็น ????????? โดย อดิศร ขาวสังข์  (อ่าน 3844 ครั้ง)
ไร้คอนเซปต์ ****** ออฟไลน์ ออฟไลน์ เพศ: ชาย พลังสะสม: 9130 นิค ณ ระยอง
กุมภาพันธ์ 20, 2007, 07:59:32 AM
ผลงาน: 6767
nick_indy
๛ เทพไร้คอนเซปต์ ๛
ไร้คอนเซปต์
******

ผลงาน: 6767
ออฟไลน์ ออฟไลน์

เพศ: ชาย
พลังสะสม: 9130


นิค ณ ระยอง

เว็บไซต์
« เมื่อ: กุมภาพันธ์ 20, 2007, 07:59:32 AM »
เมื่อภาษาไทยกลายเป็น ????????? 

คัดลอกจาก http://www.phpconcept.com/ เพิ่มเติมบางส่วนโดย อดิศร  ขาวสังข์
http://www.itwizard.info/technology/MySQL/MySQL_with_thai.html

ผมเคยติดตั้งและใช้งาน PHP และ MySQL มาหลายครั้งหลายหน ไม่ว่าจะเป็นการติดตั้งบน Linux หรือ Windows ทั้งที่ Compile เองและติดตั้งแบบ package  ซึ่งการติดตั้งบน Windows ดูจะติดตั้งอย่างสะดวกและรวดเร็วมากขึ้น เพราะมีผู้ทำโปรแกรมช่วยติดตั้ง Apache PHP และ MySQL อัตโนมัติ เช่น AppServ (www.appservnetwork.com) และ XAMPP (http://www.apachefriends.org/en/index.html) เป็นต้น

แต่คราวนี้ผมเจอปัญหาหลังจากการติดตั้ง Apache PHP และ MySQL บนระบบปฏิบัติการ Windows เพราะเมื่อทดลอง query ข้อมูลที่เป็นภาษาไทยจาก MySQL กลับพบว่าได้ผลลัพธ์ในการแสดงผลภาษาไทยที่ไม่ถูกต้อง คือตัวอักษรภาษาไทยจะแสดงออกมาเป็นเครื่องหมายคำถาม (?) ทั้งหมด ในขณะที่ผมได้เพิ่ม option ที่เกี่ยวกับการ set character ให้เป็นภาษาไทยใน my.ini แล้ว ดังตัวอย่างต่อไปนี้

[mysqld]
default-character-set=tis620

หลังจากที่ได้ทำการตรวจสอบแล้วในฐานข้อมูล MySQL โดยใช้โปรแกรม เช่น MySQL-Front (http://www.mysqlfront.de/) แล้วก็พบว่าข้อมูลที่เก็บอยู่ก็เป็นภาษาไทยถูกต้อง และเมื่อลองดูตัวแปรต่างๆ ที่เกี่ยวข้องกับ character ต่างๆ ก็พบค่าต่อไปนี้

- character_set_client = tis620
- character_set_connection = tis620
- character_set_database = tis620
- character_set_results = tis620
- character_set_server = tis620
- character_set_system = utf8
- collation_connection = tis620_thai_ci
- collation_database = tis620_thai_ci
- collation_server = tis620_thai_ci

เมื่อลองไปค้นในเว็บไซท์ของ MySQL ในส่วนที่เกี่ยวข้องกับกลุ่มอักขระ (character set) ก็พบส่วนที่เกี่ยวข้องกับกลุ่มอักขระ ใน Chapter 10. Character Set Support (http://dev.mysql.com/doc/mysql/en/charset.html) ซึ่งได้อธิบายความหมายของ Character set ไว้ว่าคือ กลุ่มของสัญลักษณ์และการ encode อักขระต่างๆ ส่วน collation หมายถึง กลุ่มของกฎเกณฑ์ที่ใช้ในการเปรียบเทียบอักขระต่างๆ ใน กลุ่มอักขระหนึ่งๆ สำหรับภาษาไทยมีกลุ่มอักขระคือ tis620 และมี collation คือ tis620_thai_ci

ทั้งนี้ระดับการใช้งานของ charcter set และ collation มีอยู่ด้วยกันทั้งหมด 4 ระดับคือ server database table และ connection สำหรับปัญหาที่ผมเจอนี้ ผมมุ่งประเด็นไปที่ connection โดยตั้งสมมติฐานว่าปัญหาของการแสดงผลภาษาไทยที่ผิดพลาดน่าจะเกิดระหว่างการติดต่อระหว่าง client (php script) กับ server (MySQL server)

สิ่งที่เกิดขึ้นระหว่างการติดต่อระหว่าง client และ server คือ client จะส่ง SQL statement เช่น query ต่างๆ ให้กับ server หลังจากนั้น server ก็จะตอบกลับ เช่น การส่งผลลัพธ์ของ SQL statement นั้นๆ กลับไปให้ client ในระหว่างที่มีการติดต่อกันนี้จะมีส่วนของ character set และ collation เข้ามาเกี่ยวข้อง คือ

Character set ของ client ในขณะที่ส่ง query ให้กับ server: มีตัวแปรที่เกี่ยวข้องคือ character_set_client
Character set ที่ server แปล query หลังจากที่ได้รับจาก client: ตัวแปรที่เกี่ยวข้องคือ character_set_connection และ collation_connection โดย server จะใช้ค่าของตัวแปร character_set_connection ในการแปล character set ของ query ที่ client ส่งมา ( character_set_client) ให้เป็นตามค่าที่กำหนดไว้ในตัวแปร character_set_connection
Character set ที่ server จะทำการแปลก่อนที่จะส่งผลลัพธ์กลับไปให้แก่ client: ตัวแปรที่เกี่ยวข้องคือ character_set_results

ดังนั้นตัวแปรที่ควรจะทำการตรวจสอบก่อนก็คือ character_set_results ว่าค่าของตัวแปรนั้นเป็นค่าอะไรหรือเป็นค่าที่เกี่ยวข้องกับปัญหานี้หรือไม่  ผมทดสอบโดยการกำหนดค่าให้ chacter_set_results มีค่าเป็น tis620 ก่อนจะทำการส่ง query จริงๆ ไปให้แก่ MySQL  โดยการใช้คำสั่งต่อไปนี้

$charset = "SET character_set_results=tis620";
mysql_query($charset) or die('Invalid query: ' . mysql_error());

ผลปรากฎว่าการกำหนดค่าให้ตัวแปร character_set_results มีค่าเป็น tis620 ดังกล่าว สามารถช่วยแก้ปัญหาแสดงผลภาษาไทยที่ไม่ถูกต้องได้   นอกจากนี้สามารถใช้คำสั่งต่อไปนี้ในการแก้ปัญหาภาษาไทย คือ

SET NAMES 'tis620' ซึ่งมีค่าเทียบเท่ากับ
SET character_set_client='tis620'
SET character_set_results='tis620'
SET character_set_connection='tis620'
SET chracter_set_results=NULL  ซึ่งมีความหมายคือ ไม่ต้องการให้ server ทำการแปลงข้อมูลก่อนที่จะทำการส่งให้กับ client
สรุปแล้วปัญหาที่เกิดขึ้นน่าจะเกิดจากค่าของตัวแปร character_set_results ซึ่งถูกกำหนดให้เป็น character set ที่ไม่ใช่ tis620 ทำให้อักขระภาษาไทยที่ส่งกลับมาให้ client นั้นแสดงผลไม่ถูกต้อง  วิธีการแก้ปัญหาของผมในขณะนี้คือ ต้องแทรกคำสั่งที่กำหนดให้ character_set_results เป็น tis620 ก่อนที่จะทำการส่ง query จริงๆ ไปให้แก่ MySQL  ผมเองค่อนข้างงงว่าเหตุใดการกำหนดคำสั่ง default-character-set=tis620 ไม่สามารถแก้ปัญหานี้ได้  หากมีคำแนะนำหรือมีข้อเสนอแนะสามารถเขียนแจ้งมาได้นะครับที่ webmaster [a] phpconcept.com

ส่วนนี้เพิ่มเติมโดยอดิศร
จากประสบการณ์การใช้งานผมได้สร้าง PHP Script ที่ใช้สำหรับการติดต่อกับ MySQL ชุดหนึ่งซึ่งใน Script นี้จะมีการเซ็ตค่าภาษาไทยที่สามารถใช้งานได้ดีโดยไม่มีปัญหาภาษาไทย ทั้งการ Insert , Update, Select ดังนี้ครับ :
----------------------------------------------------------------------------------------------------------------------------------------------------
<?
//กำหนด ชื่อดาต้าเบสเซิร์ฟเวอร์ , ชื่อฐานข้อมูล , ล็อกอิน และ รหัสผ่าน สำหรับติดต่อกับฐานข้อมูลให้กับตัวแปร
$ServerName = "localhost";
$DatabaseName = "MyDatabase";
$User = "root";
$Password = "";


//ติดต่อกับฐานข้อมูลผ่านฟังก์ชัน MySQL
$Conn = mysql_connect($ServerName,$User,$Password) or die ("ไม่สามารถติดต่อกับเซิร์ฟเวอร์ได้");

//เลือกชื่อฐานข้อมูล คือ
mysql_select_db($DatabaseName,$Conn) or die ("ไม่สามารถติดต่อกับฐานข้อมูลได้");

$cs1 = "SET character_set_results=tis620";
mysql_query($cs1) or die('Error query: ' . mysql_error());

$cs2 = "SET character_set_client = tis620";
mysql_query($cs2) or die('Error query: ' . mysql_error());

$cs3 = "SET character_set_connection = tis620";
mysql_query($cs3) or die('Error query: ' . mysql_error());
?>
---------------------------------------------------------------------------------------------------------------------------------------------------

หวังว่าบทความนี้จะช่วยแก้ปัญหาให้กับบางท่านได้นะครับ :)
 
 

# www.na-man.com : www.facebook.com/nicknarayong
# บริการ Hosting, Domain, Website, Joomla, SMF,phpBB Webboard และอื่นๆ ในราคาพิเศษสุดๆ สนใจติดต่อสอบถามได้ครับ
# Email & MSN nick@na-man.com
# หรือโทรศัพท์ 0837690256
ขั้น 4 : แฟนคลับบอร์ด *** ออฟไลน์ ออฟไลน์ พลังสะสม: 718
กุมภาพันธ์ 21, 2007, 09:26:29 AM
ผลงาน: 1002
gere
แฟนคลับ
ขั้น 4 : แฟนคลับบอร์ด
***

ผลงาน: 1002
ออฟไลน์ ออฟไลน์

พลังสะสม: 718

« ตอบ #1 เมื่อ: กุมภาพันธ์ 21, 2007, 09:26:29 AM »
ขอบคุณค่ะ
ไร้คอนเซปต์ ****** ออฟไลน์ ออฟไลน์ เพศ: ชาย พลังสะสม: 9130 นิค ณ ระยอง
มีนาคม 02, 2007, 08:08:37 AM
ผลงาน: 6767
nick_indy
๛ เทพไร้คอนเซปต์ ๛
ไร้คอนเซปต์
******

ผลงาน: 6767
ออฟไลน์ ออฟไลน์

เพศ: ชาย
พลังสะสม: 9130


นิค ณ ระยอง

เว็บไซต์
« ตอบ #2 เมื่อ: มีนาคม 02, 2007, 08:08:37 AM »
ปัญหาใน mysql5,php5

วันนี้ไปเจอปัญหานิดหนึ่งใน mysql 5 ซึ่งจริงๆแล้วไม่ได้เคย php มานานมาก วันนี้ได้มีโอกาส Set Server เองให้สามารถใช้งาน php5 กับ  mysql5 เจอปัญหาซะแล้ว
ปัญหาแรก
     php ไม่สามารถเรียกข้อมูลใน mysql ออกมาเป็นภาษาไทยได้ออกมาเป็น .. ????????
สาเหตุ
     น่าจะเกิดจากการกำหนด charset ในขณะที่กำลังดึงข้อมูลไม่ถูกต้องเพราะ default  charset ใน database ก็เป็น tis620 อยู่แล้ว
วิธีการแก้
     การ Set Charset ให้เป็น tis620 ในขณะที่ใช้ php เป็นตัวดึงข้อมูลออกมาแสดง เช่น
   
    mysql_query("SET character_set_results=tis620");
    mysql_query("SET character_set_client='tis620'");
    mysql_query("SET character_set_connection='tis620'");
    mysql_query("collation_connection = tis620_thai_ci");
    mysql_query("collation_database = tis620_thai_ci");
    mysql_query("collation_server = tis620_thai_ci");
   
ปัญหาที่สอง
    เมื่อลง mysql5 แล้วเมื่อทำการ connect จากเครื่องอื่นที่ไม่ใช่ local  จะฟ้อง Error ว่า
       remote host is not allowed to connect to this mysql server
วิธีการแก้
       ต้องทำการ GRANT สิทธิ user ให้ user สามารถเข้ามาจาก host ตัวไหน สามารถกำหนด เป็น "%" สำหรับกำหนดว่า connect มาจาก host ไหนก็ได้

[root@localhost]# mysql -u username -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.20-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> GRANT ALL ON *.* TO 'your_username'@'%' IDENTIFIED BY 'your_password';
Query OK, 0 rows affected (0.14 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.16 sec)

mysql> \q
Bye
wayukul
เมษายน 03, 2007, 09:30:24 AM
ผลงาน: 0
wayukul
บุคคลไม่รู้ว่าใคร
« ตอบ #3 เมื่อ: เมษายน 03, 2007, 09:30:24 AM »
เป็นในมือถือ  แก้ได้เปล่า
ไร้คอนเซปต์ ****** ออฟไลน์ ออฟไลน์ เพศ: ชาย พลังสะสม: 9130 นิค ณ ระยอง
เมษายน 03, 2007, 09:46:30 AM
ผลงาน: 6767
nick_indy
๛ เทพไร้คอนเซปต์ ๛
ไร้คอนเซปต์
******

ผลงาน: 6767
ออฟไลน์ ออฟไลน์

เพศ: ชาย
พลังสะสม: 9130


นิค ณ ระยอง

เว็บไซต์
« ตอบ #4 เมื่อ: เมษายน 03, 2007, 09:46:30 AM »
ไม่เกี่ยวกะมือถือ อันนี้เป็นโปรแกรม mysql บน server
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป:  

Powered by MySQL Powered by PHP Valid XHTML 1.0! Valid CSS!