ตัวหนังสืออ่านไม่ออก เป็นเครื่องหมายคำถาม

การเปลี่ยนการเข้ารหัส หรือ Collation ฐานข้อมูลบน Server มักจะสร้างปัญหาเกี่ยวกับตัวอักษร ทำให้อ่านไม่ออก กลายเป็นเครื่องหมายคำถาม หรือ ตัวอักษรต่างดาวก็มี ดังตัวอย่างข้างล่างนี้


สาเหตุเกิดจากการไม่เข้ากันของการกำหนดชุดอักษร บนฐานข้อมูล MySql ใน Server และการใช้ encoding ของไฟล์ ตลอดจนการกำหนดชุดตัวอักษร หรือ charset บนหน้าเว็บ ทำให้มีปัญหาไม่ลงตัว Browser จึงแสดงออกมาเป็นเครื่องหมายคำถาม หรือ ข้อความต่างดาว อ่านไม่ออก

เมื่อสังเกตจากตัวอย่าง จะเห็นว่า บางตัวก็เป็นตัวหนังสือธรรมดา แต่บางตัวก็เป็นตัวอ่านไม่ออก ที่เป็นเช่นนี้เพราะ ตัวที่อ่านไม่ออก เป็นข้อมูลที่ดึงออกมาจากฐานข้อมูลบน Server ส่วนตัวที่อ่านออก เป็นส่วนที่เขียนโค้ดในหน้าเว็บ ในตัวอย่างนี้ หน้าเว็บกำหนด charset เป็น tis-620

วิธีการแก้ไข

หลังจากที่ติดต่อกับฐานข้อมูลแล้ว ให้ใช้คำสั่ง mysql_set_charset() เพื่อเปลี่ยนให้เป็น charset ที่ใช้ในหน้าเว็บ เช่น

                                $cid = mysql_connect($host,$usr,$pwd);
mysql_set_charset("tis620",$cid);
mysql_select_db($db);

เมื่อเปลี่ยนแล้ว ตัวหนังสือก็จะแสดงตามปกติ


อีกปัญหาหนึ่งที่เกิดขึ้นคือ ไม่สามารถใช้คำสั่ง SQL ในตารางในฐานข้อมูลได้ ทั้ง ๆ ที่คำสั่ง SQL ถูกต้องทุกประการ ที่เป็นเช่นนี้ เพราะ encoding ไม่ตรงกัน เช่น

คำสั่ง SQL

$sql = "SELECT * from student where title='$title' AND fname='$fname' AND lname='$lname' AND b_day='$b_day' AND b_month='$b_month' AND b_year='$b_year'";

$result = mysql_query($sql) or die("Couldn't execute query!!!");

ไม่สามารถเข้าไปในตารางฐานข้อมูลได้ ดังผลปรากฎที่หน้าจอ
การแก้ไขคือ ปรับ encoding ของ ฐานข้อมูลให้เข้ากับที่ใช้ในหน้าเว็บ ด้วยคำสั่ง mysql_query("SET NAMES tis620"); โดยสั่งก่อนหน้าที่จะใช้คำสั่ง mysql_query() เช่น

$sql = "SELECT * from student where title='$title' AND fname='$fname' AND lname='$lname' AND b_day='$b_day' AND b_month='$b_month' AND b_year='$b_year'";

mysql_query("SET NAMES tis620");
$result = mysql_query($sql) or die("Couldn't execute query!!!");

ก็จะแก้ปัญหาไป ได้


ชุดตัวอักษรที่ ฐานข้อมูล MySql ที่ใช้ได้ มีหลายชุด คือ
mysql> SHOW CHARACTER SET;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+




อ้างอิง
http://php.net/manual/en/function.mysql-set-charset.php
http://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html





ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

อุปมา อุปไมย สำนวนการเปรียบเทียบ ของไทย

แนวข้อสอบ เงื่อนไขสัญลักษณ์

ความสามารถทั่วไปด้านเหตุผล การหาความสัมพันธ์จาก ภาพ สัญลักษณ์