View Full Version : ปัญหา ภาษาไทย กับ mysql (แสดงผลเป็น ????)
asylu3
06-10-2005, 10:33 PM
เป็นปัญหากวนใจผมมานานแล้วก็หวังว่าเพื่อนๆหลายคงคงจะเคยเจอ
ปัญหาที่ว่านี้คือเมื่อเราทำการ insert data เก็บลงฐานข้อมูล ผ่านคำสั่ง mysql_query
ภาษาไทยจะกลายเป็นเครื่องหมาย ????
ในตอนแรกนั้นผมนึกว่าจะมีปัญหาเกี่ยวกับ charset= tis-620
แต่ลองแล้วก็แก้ปัญหานี้ไม่ได้เลย หนทางหนึ่งที่ผมลองแล้วได้ผลคือ
ก่อนทำการใช้ คำสั่ง mysql_query() ให้ทำการเพิ่ม คำสั่ง
mysql_query("SET NAMES TIS620"); ไว้ก่อนหน้า
จะช่วยแก้ปัญหาได้ หากเพื่อนมีวิธีอื่นที่ดีกว่านี้ก็แนะนำมาได้นะครับ
สำหรับการแก้แบบอื่นผมไปเจอมา
http://www.phpconcept.com/index.php?option...task=view&id=21 (http://www.phpconcept.com/index.php?option=content&task=view&id=21)
เว็บนี้ละเอียดมาก
newsbot
28-02-2006, 01:16 AM
เสริมนิดนึงครับถ้าหากเจออาการ ??? ให้ลองเช็คที่ ไฟล์ต้นฉบับของ database ที่ใช้ dump ดูว่าเห็นตัวอักษรเป็นแบบไหนแล้วก็ charset ของแต่ละ table เป็นอย่างไร
เช่น
1. ถ้าเห็นตัวหนังสือของข้อความภาษาไทยแสดงเป็น
xe0xb8xb2 (escape sequence) ก็แสดงว่าถูกต้องถ้าแสดงเป็นอย่างอื่นอาจจะทำให้การ dump ผิดพลาด
2. ให้ดู syntax ของการสร้างตารางที่ด้านท้ายว่าเป็นแบบนี้หรือไม่
ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=24 ;
ถ้าใช้ให้ลองแก้เป็น
ENGINE=MyISAM DEFAULT AUTO_INCREMENT=24 ;
ดูว่าใช้ได้ไหม (dump ผ่านหรือเปล่า+ ภาษาไทยอ่านได้)
ถ้าไม่ได้ให้แก้เป็น
ENGINE=MyISAM ;
ซึ่งถ้าเป็นแบบหลังนี้จากประสบการณ์ mysql จะ detect charset ของ table ให้เองแล้วก็แสดงผลได้ถูกต้อง
แบบนี้เคยเจอมาแ้ว้ว ง่ะ แล้วก้อแก้ได้แว้วว อิอิ
omyim
03-02-2007, 01:31 PM
ขอบคุณครับ เจอปัญหานี้เมหือนกันตอนเปลี่ยนมาใช้ php5
ผมใช้ ipb 2.2 import แล้วมันเป็น ??????????? จะต้องใส่ db connection ที่ไฟล์ไหน จุดไหนบ้างครับ
ของผมต้องใส่ทั้งหมดนี้เลยอะตอน search เป็นภาษาไทย
SET character_set_client='utf8'
SET character_set_results='utf8'
SET character_set_connection='utf8'
ไม่งั้นมันไม่ยอมให้ผ่าน ตอนแรกนึกว่าใส่บรรทัดเดียวก็หายแล้วอะ
แถมบางที insert ยังต้องใส่อีกอะ
guitarstyle
07-06-2007, 12:27 AM
นี่เป็นอีกวิธีนึงที่ค้นพบมานะครับ (พร้อมโค๊ดตัวอย่าง)
ง่ายเลยนะแบบไม่ต้องไปคอนฟิกอะไรที่ php หรือ mysql
ในไฟล์ dbconfig เพิ่ม
--------------------------------------------------------------------------------
<?
$username = "root";
$password = "password";
$host="hostname";
$db="mydb";
mysql_connect($host,$username,$password);
mysql_select_db($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_thai_ci");
mysql_query("collation_database = utf8_thai_ci");
mysql_query("collation_server = utf8_thai_ci");
?>
ลองดูนะครับ
ojkdbo
16-08-2007, 02:21 PM
ตอนใช้ mysql < 4.0 ไม่เคยเจอเลย แต่พอใช้ 4.1 ขึ้นไป ล่ะเจอ เลยครับ
นั่งหาวิธีแก้ตั้งนาน ตอนนี้ เลยเปลี่ยน charset จาก utf8 เป็น UTF-8 หมดแล้วครับ
Komkid
18-09-2007, 09:05 AM
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_thai_ci");
mysql_query("collation_database = utf8_thai_ci");
mysql_query("collation_server = utf8_thai_ci");
[/b]
วิธีนี้ใช้ได้จริง ๆ ครับ PHP5 + MySQL5 ไม่มีปัญหา
activexxx
24-09-2007, 02:52 PM
แต่ก่อนเคยใช้แล้วมีปัญหา ต่อมาผมใช้ windows 874 และภาษา tahoma ทั้งหมด ก้ผ่าน
Komkid
06-10-2007, 03:31 PM
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_thai_ci");
mysql_query("collation_database = utf8_thai_ci");
mysql_query("collation_server = utf8_thai_ci");
ใช้ตามข้างบนได้ครับ
เวลาแสดงผลใน browser มันจะแสดงผลเป็น unicode(UTF-8) ก่อน พอเปลี่ยนเป็น tis-620 ก็ใช้ได้
แต่สงสัยว่าทำไมจึงเป็นอย่างนั้น ทั้ง ๆ ที่ set meta tag ไว้แล้ว ว่า charset=tis-620
popvip
11-03-2008, 05:26 AM
$conn = mysql_connect(”$hostname”,”$username”,”$password”);
mysql_query(”SET CHARACTER SET utf8?);
mysql_query(”SET collation_connection = ’utf8_thai_ci’ “);
mysql_select_db($dbname);
นำมาประยุกต์ง่ายๆ คือนำโค๊ดที่ได้นี้ไปสร้างเป็น include file สำหรับการสร้าง Connection แล้วทำการ include เข้ามาทุกไฟล์ที่มีการ Select, Insert, Update (เพื่อลดปัญหาการเขียนโค๊ดซำ้ๆ กัน) ปัญหาในการใช้ภาษาไทยกับ MySQL 5 ก็จะหมดไป
จริงๆรับประกันเลยครับ...
sukorn
01-02-2009, 02:41 AM
คำสั่ง SET NAMES 'utf8' เพียงพอกับการแก้ปัญหา ??? แล้วครับ เพราะมันจะไปกำหนดค่า character set และ collation ที่เกี่ยวข้องทั้งหมดให้
คำสั่งนี้จะบอกให้ MySQL Server รับรู้ว่า "หลังจากคำสั่งนี้เป็นต้นไป client จะส่งข้อมูลต่าง ๆ มาเป็น charset นี้นะ เพราะฉะนั้นก็ส่งค่าที่ SELECT ได้กลับไปด้วย charset นี้เช่นกัน"
A SET NAMES 'x' statement is equivalent to these three statements:
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;[/b]
อ้างอิง: http://dev.mysql.com/doc/refman/5.0/en/cha...connection.html (http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html)
แต่..ทำไมเราต้องมานั่ง execute คำสั่งนี้ทุกครั้งด้วยล่ะเนี่ย???
นั่นเป็นเพราะว่า charset ของ client นั้นไม่ใช่ utf8 ครับ ลองเอาคำสั่งนี้ไปรันดูที่ server ครับ
$con = mysql_connect('localhost','root','strong_password');
echo mysql_client_encoding($con);
ถ้าเราทำงานบน Window ลง Apache และ PHP แบบแยก (ผมไม่ได้ใช้ XAMPP) เราจะได้ latin1 มาครับ นั่นเพราะว่า php_mysql.dll มันถูกคอมไพล์มาด้วย charset latin1 เวลาเรา SELECT อะไรมันก็จะส่งเป็น latin1 เสมอ ทำให้เราต้องมานั่งเปลี่ยน charset กันวุ่นวาย
ถ้าคุณใช้ PHP 5 >= 5.2.3 เค้าแนะนำให้ใช้ ฟังก์ชัน mysql_set_charset() (http://th.php.net/manual/en/function.mysql-set-charset.php) แทนการรันคำสั่ง SET NAMES ครับ
หรือถ้าใช้รุ่นต่ำกว่าก็อาจจะเปลี่ยนมาใช้ mysqli แทน มันมี method mysqli::set_charset('utf8') (http://th.php.net/manual/en/mysqli.set-charset.php) ที่ทำงานเหมือนกับการรัน SET NAMES
ทั้งนี้การกำหนดให้ charset ของหน้าเพจ, database, table และ column ตลอดจนอักขระข้อมูล เป็น utf8 หรือเป็น utf8 ก็ต้องทำตั้งแต่ตอนเริ่มต้นด้วยครับ
เท่าที่รู้ครับ หวังว่าจะเป็นประโยชน์บ้างครับ
zcoolmax
17-02-2009, 09:46 PM
สำหรับผมใช้คำสั่งนี้ ตอนติดต่อกับฐานข้อมูลแล้ว
$charset = "SET character_set_results=utf8";
mysql_query($charset) or die('Invalid query: ' . mysql_error());
อีกวิธีคือใช้ version ที่เก่าๆ เพราะที่เจอๆมา ตัวใหม่ๆที่ออกมาจะเจอกับปัญหานี้มาก
Thegodth
05-05-2009, 09:31 PM
เอ่อ ... มันมีวิธีง่ายกว่านั้นนะครับ สำหรับคนที่เช่า hosting เขา แล้วไม่สามารถแก้ไข my.cnf ได้
ลองสร้าง database ขึ้นมา 1 อัน ใช้ phpmyadmin ก็ได้ แล้วตั้งให้ Collation เป็น utf8_general_ci
จากนั้น ลอง import ไฟล์ .sql เข้าไปดู โดยเลือก Character set of the file เป็น UTF8
(กรณี ภาษาไทย หรือ ascii ให้ใช้ latin1 เพื่อจะได้ compatible กับ mysql 4.0.x)
จากนั้น ใช้ code นี้ครับ
<?
$dbconn = mysql_connect($hostname, $db_username, $db_pass) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db($db_name,$dbconn) or die('ERROR: Connect Database failed');
mysql_query("SET NAMES UTF8"); // <- สำคัญที่ตรงนี้
?>
ในส่วนตรงนี้ มันเป็นการประกาศให้รู้ว่า เราจะเรียกข้อมูลออกมาโดยใช้ charset เป็น UTF8
mysql_query("SET NAMES UTF8");
จากนั้นที่ page meta header ของ html ให้ใช้ charset="utf-8"
(กรณี ภาษาไทย หรือ ascii ให้ใช้ tis-620 ได้ตามปกติ)
ลองดูนะครับ อย่าลืมว่า ต้อง save ไฟล์เป็น utf8 ด้วย
(กรณี ภาษาไทย หรือ ascii ไม่ต้อง save as เป็น utf8 ครับ)
ปล. คำสั่ง mysql_set_charset() ยังไม่เคยลอง เดี๋ยวต้องเอาไปลองดูครับ
sakang
02-06-2009, 11:22 AM
มันจะไม่เกิดปัญหานี้หรอครับที่ว่า set ภาษา ไปที่ฐานข้อมูลให้แสดงผลเป็นภาษาไทย พอ php ดึงข้อมูลในฐานข้อมูล ออกมาแล้วจะแสดงผลเป้นตัว ????? ตลอดเลย ไม่เกิดหรอครับปัญหานี้ แต่ผมว่า ถึงในฐานข้อมูลจะขึ้นภาษาอะไร ถึงยังไงดึงออกมาก็แสดงผลออกมาเป็นภาษาไทยอยู่ดี ถ้าแก้ผมว่าแก้ที่ไฟล php ให้แสดงเป้นภาษาดีกว่าครับ ในฐานอย่าไปทำเลย เสี่ยง :lol:
wutchrakorn
29-06-2009, 10:37 AM
ผมลองมา 2 วันตั้งหลายวิธี ทั้งไปแก้ใน mysql .config และอื่นๆตามที่เจ้าของกระทู้ตั้งแต่ไม่ยอมให้ผ่าน แต่วิธีนี้ใช้ได้ครับไม่มีปัญหาตามมาด้วย เลิกงงซักที
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions Inc. All rights reserved.