|
แก้ปัญหาภาษาไทย php กับ MySQL (TIS-620 กับ UTF-8) |
ปัญหาภาษาไทย PHP กับ MySQL ??????????
บทความ PHP & MySQL
เหตุผลที่ผมทำบทความนี้ขึ้นก็ก็เพราะมีกระทู้ถามเกี่ยวกับภาษาไทย ?????? ทุกวันครับ และเป็นปัญหาที่แก้ไม่จบซะทีสำหรับผู้ที่ กำลังเริ่มเขียน MySQL 4.1.x และ 5.0.x ขึ้นไป เพราะในเวอร์ชั่นใหม่นี้ ทาง MySQL ได้ให้ความสำคัญกับ Charset มากขึ้นกว่าเวอร์ชั่น เดิม ๆ ก่อนหน้านี้ที่เรา ๆ ใช้ latin1 ในการเก็บข้อมูลที่เป็นภาษาไทยซึ่งจะมีปัญหาค่อนข้างบ่อยเกี่ยวกับการแสดงผลที่ผิดเพี้ยน การจัดเรียงที่ไม่ถูกต้อง และความจำกัดทางด้านรองรับหลาย ๆ ภาษา ทั้งนี้ผมคิดว่าการนำ Chatset มาใช้ ทาง mySQL เองต้องการแก้ปัญหาที่เกี่ยวข้องกับภาษากับการใช้งาน Application อื่น ๆ ที่รองรับรูปแบบ UTF-8 ไปหมดแล้ว คงจะเหลือแต่คนไทยส่วนมากที่ยังคงยึดตึดกับ TIS-620 ถึงคราวที่เราจะต้องเปลี่ยนมาใช้ UTF-8 กันได้แล้วครับ และผมกล้ารับประกันเลยครับว่า มันดีกว่าเดิม จะช่วยลดปัญหาต่าง ๆ ที่เกี่ยวกับภาษาไทยได้อย่างหมดเกลี้ยง ครับ
ถึงบทความนี้จะมีให้เลือกใช้ทั้ง TIS-620 และ UTF-8 แต่ผมยังแนะนำให้เปลี่ยนให้เป็น UTF-8 ให้หมดครับ
1. การใช้ภาษาไทยกับ TIS-620
ในการใช้ Collation ของ TIS-620 การสร้างตารางหรือแม้แต่ฟิวส์ให้ใช้เป็น tis620_thai_ci และในการ Import หรือ Export ข้อมูลก็จะต้องใช้เป็น tis620 เช่นเดียวกันครับ ตามรูปตัวอย่างครับ
กำหนด Collation ของตาราง
กำหนด Collation ของฟิวส์
กรณีที่มีการ import หรือ Export ข้อมูลให้เลือกเป็น tis620
1.2 กำหนด Header ให้ใช้เป็น tis-620
<meta http-equiv=Content-Type content="text/html; charset=tis-620">
1.3 กำหนดในส่วนของ Connection
- กรณีที่กำหนด Collation เป็น tis620_thai_ci ให้ใช้
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
mysql_query("SET NAMES TIS620");
- กรณีที่กำหนด Collation อื่น ๆ ให้ใช้
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
mysql_query("SET character_set_results=tis620");
mysql_query("SET character_set_client=tis620");
mysql_query("SET character_set_connection=tis620");
ตัวอย่าง Code เต็ม ๆ ครับ
<html>
<head>
<title>ThaiCreate.Com PHP & TIS-620</title>
<meta http-equiv=Content-Type content="text/html; charset=tis-620">
</head>
<body>
<?php
/*** Connect ***/
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
mysql_query("SET NAMES TIS620");
/*
// Or //
mysql_query("SET character_set_results=tis620");
mysql_query("SET character_set_client=tis620");
mysql_query("SET character_set_connection=tis620");
*/
/*** Add Record ***/
if($_GET["Action"]=="Save")
{
$strSQL = "INSERT INTO mydata_tis620 (NAME,SURNAME) VALUES ('".$_POST["txtName"]."','".$_POST["txtSurname"]."')";
mysql_query($strSQL);
}
/*** List Record ***/
$strSQL = "SELECT * FROM mydata_tis620";
$objQuery = mysql_query($strSQL) or die ("Error Query [".$strSQL."]");
?>
<table width="498" border="1">
<tr>
<th width="87"> <div align="center">UID </div></th>
<th width="145"> <div align="center">NAME </div></th>
<th width="244"> <div align="center">SURNAME </div></th>
</tr>
<?php
while($objResult = mysql_fetch_array($objQuery))
{
?>
<tr>
<td><div align="center"><?php echo $objResult["UID"];?></div></td>
<td><?php echo $objResult["NAME"];?></td>
<td><?php echo $objResult["SURNAME"];?></td>
</tr>
<?php
}
?>
<form name="frmMain" method="post" action="?Action=Save">
<tr>
<td>
</td>
<td><input name="txtName" type="text" id="txtName"></td>
<td><input name="txtSurname" type="text" id="txtSurname">
<input name="btnSubmit" type="submit" id="btnSubmit" value="Submit"></td>
</tr>
</form>
</table>
<?php
mysql_close($objConnect);
?>
</body>
</html>
Output
2. การใช้ภาษาไทยกับ UTF-8
ในการใช้ Collation ของ UTF-8 การสร้างตารางหรือแม้แต่ฟิวส์ให้ใช้เป็น utf8_unicode_ci และในการ Import หรือ Export ข้อมูลก็จะต้องใช้เป็น utf8 เช่นเดียวกันครับ ตามรูปตัวอย่างครับ
กำหนด Collation ของตาราง
กำหนด Collation ของฟิวส์
กรณีที่มีการ import หรือ Export ข้อมูลให้เลือกเป็น utf8
2.2 กำหนด Header ให้ใช้เป็น utf-8
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
2.3 กำหนดในส่วนของ Connection
- กรณีที่กำหนด Collation เป็น utf8_unicode_ci ให้ใช้
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
mysql_query("SET NAMES UTF8");
- กรณีที่กำหนด Collation อื่น ๆ ให้ใช้
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
mysql_query("SET character_set_results=utf8");
mysql_query("SET character_set_client=utf8");
mysql_query("SET character_set_connection=utf8");
ตัวอย่าง Code เต็ม ๆ ครับ
<html>
<head>
<title>ThaiCreate.Com PHP & UTF-8</title>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
</head>
<body>
<?php
/*** Connect ***/
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
mysql_query("SET NAMES UTF8");
/*
// Or //
mysql_query("SET character_set_results=utf8");
mysql_query("SET character_set_client=utf8");
mysql_query("SET character_set_connection=utf8");
*/
/*** Add Record ***/
if($_GET["Action"]=="Save")
{
$strSQL = "INSERT INTO mydata_utf8 (NAME,SURNAME) VALUES ('".$_POST["txtName"]."','".$_POST["txtSurname"]."')";
mysql_query($strSQL);
}
/*** List Record ***/
$strSQL = "SELECT * FROM mydata_utf8";
$objQuery = mysql_query($strSQL) or die ("Error Query [".$strSQL."]");
?>
<table width="498" border="1">
<tr>
<th width="87"> <div align="center">UID </div></th>
<th width="145"> <div align="center">NAME </div></th>
<th width="244"> <div align="center">SURNAME </div></th>
</tr>
<?php
while($objResult = mysql_fetch_array($objQuery))
{
?>
<tr>
<td><div align="center"><?php echo $objResult["UID"];?></div></td>
<td><?php echo $objResult["NAME"];?></td>
<td><?php echo $objResult["SURNAME"];?></td>
</tr>
<?php
}
?>
<form name="frmMain" method="post" action="?Action=Save">
<tr>
<td>
</td>
<td><input name="txtName" type="text" id="txtName"></td>
<td><input name="txtSurname" type="text" id="txtSurname">
<input name="btnSubmit" type="submit" id="btnSubmit" value="Submit"></td>
</tr>
</form>
</table>
<?php
mysql_close($objConnect);
?>
</body>
</html>
Output
จะเห็นว่าสามารถรองรับใช้ภาษาไทยได้ทั้ง 2 รูปแบบ แต่ถึงอย่างไรแล้ว ผมอยากให้เปลี่ยนให้เป็น UTF-8 ให้หมดครับ เพราะมันดีกว่าหลาย ๆ ด้านจริง ๆ ครับ สามารถดาวน์โหลด Code ได้จากข้างล่างน่ะครับ
.
|