แก้ไขภาษาไทยใน mysql ที่เป็น ?????????
Posted October 31st, 2007 by mageworkz
in
สำหรับคนที่ใช้โฮสนอก แล้วมีปัญหาเวลา connect กับ mysql แล้วไม่เป็นภาษาไทย แต่เป็นภาษาการากั้ด นะครับ ลองเอาโค้ดไปแปะที่ไฟล์ connect ดูดังนี้
<? $server = "localhost"; $user = "mageworkz.com"; $pass = "123456"; $dbname = "db_demo"; $connect_result = mysql_connect($server,$user,$pass) or die("Couldn't connect to Server!"); mysql_select_db($dbname,$connect_result) or die("Couldn't connect to DB!"); // ** ส่วนนี้ครับ mysql_query("SET character_set_results=utf8"); mysql_query("SET character_set_client='utf8'"); mysql_query("SET character_set_connection='utf8'"); mysql_query("collation_connection = utf8_unicode_ci"); mysql_query("collation_database = utf8_unicode_ci"); mysql_query("collation_server = utf8_unicode_ci"); ?>
ที่นี้ภาษา ??????? ก็จะหมดไปครับ ลองดูครับ ใช้ได้ผลหรือไม่อย่างไร
ใช้
mysql_query("SET NAMES tis620");
อย่างเดียวได้มั้ยครับ
ไม่ได้อะครับ ยังเหมืนเดิมเป็น ??????? เหมือนเดิมเลยยยย
จริงๆ ขึ้นอยู่กับข้อมูลที่เก็บเข้าไปใน mysql ตอนแรกด้วยนะครับ
สมมุติว่าเราจะใช้ Charset เป็น tis-620 ( เป็น Charset ของภาษาไทยครับ ย่อมาจาก Thai Industrial Standard 620-2533 ซึ่งเป็น ASCII ถ้าจะให้สากลก็ใช้ uft_8 ซึ่งเป็น Unicode แต่ว่าถ้าเป็นงานภาษาไทยผมก็ใช้ tis แล้วแต่ชอบครับ )
_ci ข้างหลังหมายถึง ( เช่น utf_8_unicode_ci ) Case Insensitive นะครับ ก็คือว่ามันจะมอง A กับ a เหมือนกัน มีประโยชน์ตอนที่จะ select ข้อมูลขึ้นมาครับ ในกรณีที่เราไม่สนว่าจะเป็นพิมพ์เล็ก พิมพ์ใหญ่ ถ้ามี _bin ต่อท้ายหมายถึง Binary อันนี้มันก็จะมอง A กับ a ไม่เหมือนกันแล้วครับ )
ทางฝั่ง Server ถ้าจะใช้ NAMES ก็ได้เหมือนกันครับ มันหมายถึงทั้งหมด ( มั้งนะไม่ค่อยชัวแต่น่าจะใช่ )
ถ้าจะให้ดีก็ ส่ง query นี้ก่อนทุกครั้งที่จะมีการ INSERT, UPDATE, SELECT นะครับ
แต่ว่าสำหรับบางที่ Host เค้าไม่อนุญาติให้เรากำหนด Charset เองครับ ดังนั้นเราควรที่จะให้มันแสดง Error ด้วยจะได้รู้ ว่ามัน Set ค่าแล้วหรือยัง โดยใช้อันนี้แทนครับ
ถ้ามัน SET NAMES ไม่ได้มันจะหยุดทำงานแล้วแสดง Error
สำหรับคำสั่ง die() คือจะสั่งให้ php หยุดทำงานทันที จะใช้ลอยๆก็ได้ถ้าอยากให้ php หยุดทำงาน ( ใช้เวลา DEBUG ) หรือเวลาตรวจสอบ สถานะการเข้าถึง ( ตรวจสอบ SESSION )
เช่นตัวอย่างการใช้ die() ในกรณีอื่นๆ
ถ้า Host ไม่อนุญาติให้เราใช้ SET NAMES จะมีวิธีแก้คือ เข้าไปดูว่าที่ Host เค้าใช้ Charset อะไร ใน phpmyadmin ตรงตารางที่เราสร้าง ในช่อง Collation
แล้วให้ใช้ iconv ในการแปลงข้อมูลแทนครับใช้ได้เฉพาะ Host ที่ที่มี PHP 4 >= 4.0.5, PHP 5
ใช้ iconv สำหรับแปลงไปเป็น Charset ที่เราต้องการเช่น ถ้าเราไปดูแล้วมันเป็น latin_swedish เราก็ต้องใส่ว่า แปลงจาก latin1 ไปเป็น tis-620
ปัญหามันจะอยู่ที่ว่าชื่อของ collation ที่มันแสดงกับที่เราจะเอามาใส่ใน iconv ไม่เหมือนกันนี่แหละ ต้องลองไป search google หาดูว่า ถ้าเป็น charset ชื่อนี้ต้องใช้ว่าอะไร
รูปแบบการใช้งาน iconv
iconv ( $in_charset, $out_charset, $str )
$in_cahrset : charset ที่มันเป็นอยู่
$out_charset : charset ที่เราต้องการจะแปลงให้เป็น
$str : ข้อความที่เราต้องการจะแปลง
อันนี้น่าจะใช้ได้นะครับ
เพิ่มบรรทัดนี้ลงไปใน HTML ข้างใน Tag head ด้วยครับ เพื่อการเลือกแสดงผลที่ถูกต้อง ตรง charset เปลี่ยนตามที่เราจะใช้นะครับ
ปล.
ถูกต้องเลยครับ ดังนั้นแล้วต้องล้างตารางแล้วใส่ข้อมูลเข้าไปใหม่ด้วนนะครับ ถ้าจะให้ชัวร์ก็ต้อง เขียน query แล้ว insert เข้าไปเองไม่ใช้ phpmyadmin ของ Host ( อย่าลืม setname ก่อนส่ง query ทุกครั้งเพื่อความชัวร์ ใช้ loop วนเอาครับ ทำเองไม่ยากหรอก )
อ่านดีๆก่อนใช้ Host ด้วยนะครับ บางที่เค้าจะห้ามใช้ภาษาที่ไม่ใช้ภาษาอังกฤษด้วยนะครับ ต้องดูตรงเงื่อนไข ดังนั้นถ้าเค้าจะไม่รองรับ ภาษาไทยก็ต้องทำใจครับ
อ่านเกี่ยวกับ UTF-8, TIS620, iconv เพิ่มเติมได้ที่
http://en.wikipedia.org/wiki/Utf8
http://en.wikipedia.org/wiki/TIS620
http://th.php.net/manual/en/function.iconv.php
ทดลองแล้ว Work ครับ
ขอบคุณครับ
Post new comment