PDA

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 ให้เองแล้วก็แสดงผลได้ถูกต้อง

ICz
03-10-2006, 01:10 AM
แบบนี้เคยเจอมาแ้ว้ว ง่ะ แล้วก้อแก้ได้แว้วว อิอิ

omyim
03-02-2007, 01:31 PM
ขอบคุณครับ เจอปัญหานี้เมหือนกันตอนเปลี่ยนมาใช้ php5

Golf
12-04-2007, 12:02 PM
ผมใช้ ipb 2.2 import แล้วมันเป็น ??????????? จะต้องใส่ db connection ที่ไฟล์ไหน จุดไหนบ้างครับ

milo
07-06-2007, 12:05 AM
ของผมต้องใส่ทั้งหมดนี้เลยอะตอน 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=&#39;utf8&#39;");
mysql_query("SET character_set_connection=&#39;utf8&#39;");
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=&#39;utf8&#39;");
mysql_query("SET character_set_connection=&#39;utf8&#39;");
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=&#39;utf8&#39;");
mysql_query("SET character_set_connection=&#39;utf8&#39;");
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 &#39;utf8&#39; เพียงพอกับการแก้ปัญหา ??? แล้วครับ เพราะมันจะไปกำหนดค่า character set และ collation ที่เกี่ยวข้องทั้งหมดให้
คำสั่งนี้จะบอกให้ MySQL Server รับรู้ว่า "หลังจากคำสั่งนี้เป็นต้นไป client จะส่งข้อมูลต่าง ๆ มาเป็น charset นี้นะ เพราะฉะนั้นก็ส่งค่าที่ SELECT ได้กลับไปด้วย charset นี้เช่นกัน"


A SET NAMES &#39;x&#39; 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(&#39;localhost&#39;,&#39;root&#39;,&#39;strong_password&#39;);
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(&#39;utf8&#39;) (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(&#39;Invalid query: &#39; . 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(&#39;ERROR: Connect Database failed&#39;);
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 และอื่นๆตามที่เจ้าของกระทู้ตั้งแต่ไม่ยอมให้ผ่าน แต่วิธีนี้ใช้ได้ครับไม่มีปัญหาตามมาด้วย เลิกงงซักที