กรุณาปิด AdBlock!

Cancel your adBlock please.

ขยายหน้าเว็บRegister Login
 โฆษณา
หน้า: [1]  ลงล่าง
  พิมพ์  
topic

MySQL 5.x กับภาษาไทย UTF8 ภาษาไทยเพี้ยน? ไม่รองรับภาษาไทย?  (อ่าน 58503 ครั้ง)

ไอที
« เมื่อ: 1, 02 2008, 01:47:14 PM »
สำหรับคนที่เพิ่งเริ่มเล่น phpMyAdmin ใหม่ๆ จะมีปัญหากับเรื่องของภาษาไทยเยอะมากครับ เพราะสิ่งนึงคือไม่เข้าใจเรื่องของการ ENCODING, CHARSET วันนี้จะมาอธิบายให้เข้าใจง่ายๆ

charactor encoding สำหรับ เว็บไซต์ ที่มีพื้นฐานอยู่บนภาษา html นั้นคือการแปลภาษาครับ แปลภาษาในที่นี้ก็คือ การเข้ารหัสตัวอักษร อย่างทั่วโลกที่นิยมกันคือ utf-8 บ้านเรา แต่ก่อนก็ใช้ window-874 และ tis-620 ซึ่งตอนนี้ผมเลิกใช้ไปแล้ว เพราะมีปัญหากับการ เพิ่ม,แก้ไข ข้อมูลใน MySQL ที่ทำให้ใน MySQL อ่านตัวหนังสือภาษาไทยไม่ได้

ส่วนหนึ่งมาจากความไม่เข้าใจในเรื่องของการติดตั้ง server ซึ่งขั้นตอนการติดตั้งใน version 5.x.x นั้นจะมีให้เลือก default-character-set ซึ่งจะแนะนำเป็นขั้นตอนดังนี้ครับ

ให้เลือก default-character-set เป็น utf-8 ถ้าเว็บไซต์ของเราใช้ encoding เป็น UTF-8 ครับ

ให้เลือก default-character-set เป็น tis-620 ถ้าเว็บไซต์ของเราใช้ encoding เป็น tis-620


tis-620 นั้นมีข้อเสียคือ เราอ่านกันได้เฉพาะพี่ไทยเท่านั้นครับ ส่วนใหญ่แล้ว browser ที่อยู่ในเมืองนอกเขาจะตั้ง default ไว้เป็น utf-8 เื่มื่อเ้ขาเปิดเว็บไซต์เราเข้ามา มันก็จะเป็นภาษายึกยือ หรือภาษาต่างดาว ที่อ่านไม่ออก ต้องไปเลือก charactor encoding เป็น Thai (TIS-620) ให้วุ่นวายเข้าไปอีก

ปัญหาที่เคยเกิดขึ้นกับคนที่ใช้ MySQL 4.x
 คือมันไม่สามารถเรียงตัวอักษร (ORDER BY cluase) ที่เป็นภาษาไทยได้ ซึ่งแน่นอนครับ มันเก็บได้แต่ภาษาไทย แ่ต่มันไม่รู้จักอักขระที่เป็นภาษาไทยนั่นเอง 

สิ่งที่แนะนำในการแก้ไขปัญหานี้ก็คือ
- ติดตั้ง AppServ , XAMPP, หรืออื่นๆ โดยใช้ charactor set เป็น UTF-8 ครับ
- ตั้งค่า charactor encoding ใน เครื่องมือสำหรับจัดการเว็บไซต์ให้เป็น utf-8 ครับ

โดยแก้ไขตรงส่วนนี้ ให้เป็น
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

- ถ้ามีการติดต่อฐานข้อมูล ให้เพิ่มในส่วนของ mysql_db_query($dbname,"SET NAMES UTF8");
- หรือ mysql_query("SET NAMES UTF8");

* connection ตรงนี้หมายถึงว่า ทุกครั้งที่มีการติดต่อ ให้เรา เพิ่มบรรทัดนี้เข้าไปครับ ไม่ว่าจะ select, update

หรือถ้าใครที่ทำมาแบบนี้ก็ ใส่กันแค่ทีเดียวครับ
โค๊ด:
<?php
$server
="localhost";

$db_user="root";
$db_pwd="1234";
$db_name="my_database";

$conn = @mysql_pconnect($server,$db_user,$db_pwd) or die(mysql_error());
mysql_query("SET NAMES UTF8");
@
mysql_select_db($db_name,$conn) or die(mysql_error());
?>


ถ้าจะอัพเกรดจาก MySQL 4.x มาใช้ 5.x ต้องทำยังไงให้ มันอ่านภาษาไทยได้
ก่อนอื่นเลย เราต้อง backup database ออกมา ด้วยการ Export เท่านั้น!! ถ้าติดนิสัยมักง่ายแบบเเดิมๆ ก็คือ copy ข้อมูลใน MySQL/data เอาไว้ พอลง version ใหม่ก็ paste ไปไว้ที่เดิม วิธีการนีืถือว่าผิดครับ!! เพราะมันคนละ version กัน ภาษาที่คุณได้ อาจจะไม่ใช่ ทีุ่คุณต้องการจะเห็น

เพราะว่า 4.x กับ 5.x มีความต่างกันมาก ด้วยเรื่องการการเรียงภาษาไทยครับ อย่าเข้าใจว่า มันแค่เก็บภาษาไทยได้ แต่ปัจจุบัน มันคือการเรียงตัวอักษรภาษาไทยครับ ด้วย collation ซึ่งใน 4.x ไม่มีส่วนนี้มันเป็น field ที่เพิ่มเข้ามาใจ 5.x เดี๋ยวอ่านข้อมูลต่อไปจะเข้าใจครับ

ขั้นตอนการ Export
- ให้เรา export ออกมาโดย เลือกเป็น SQL compatibility mode : MySQL40 นะครับ Compression: zipped
- เมื่อได้ก้อนข้อมูลมาแล้ว ก็ upgrade เป็นเวอร์ชั่นใหม่ แล้ว ก็ import เข้าไปโดย วิธีการ import ผ่าน phpMyAdmin
- เลือก Character set of the file: utf8 (ซึ่งตามค่ามาตรฐานที่เราตั้งไว้ตอนที่ติดตั้งครับ)
- เลือก SQL compatibility mode : MySQL40
- ทำการ import
* ปัญหาจะเกิดขึ้น อาจเป็น error ของข้อมูล ดันนี้ต้องแตกเป็นข้อๆไปครับ ว่าเกินจากอะไร ถ้าัยังไงโพสถามไว้ดีกว่า
* ข้อมูลที่นำเข้า อาจจะใหญ่ ทางที่ดี แบ่งเ็ป็น ส่วนๆ แล้วค่อย import


อ้างจาก: บทความโดย: Apples
ทำความเข้าใจกับเครื่องหมาย
  ??????????????????????????????????????????????????????????????
  ??????????????????????????????????????????????????????????????
  เวลาดึงฐานข้อมูลจาก MySQL หรือ phpMyAdmin

  ปัญหานี้เป็นปัญหาจริงหรือ
    - ไม่ใช่ปัญหาแต่ว่าผู้ใช้ปรับตัวเข้ากับเวอร์ชั่นใหม่ไม่เป็น

  ถ้าไม่ใช่ปัญหาแล้วจะทำยังไงกับ MySQL 5.x , 4.1.x ที่ไม่ยอมเป็นไทย
    - เวลา Connect Database ให้เพิ่มในส่วนของ mysql_db_query($dbname,"SET NAMES tis620");
      เพิ่มเข้าไปทุกครั้งมีมีการ Connect

  ทำการเพิ่ม SET NAMES tis620 ไปแล้วแต่ phpMyAdmin เวลา Dump ข้อมูลมันก็ยังเป็น ????? อยู่อีก

    - เปิด my.ini ขึ้นมาโดยกดที่ Start -> run พิมพ์ my.ini แล้วกด Enter
      ในส่วนของ [client] ให้เพิ่ม
           default-character-set = tis620
      ในส่วนของ [mysqld] หลัง database directory ให้เพิ่ม
           default-character-set = tis620
           character-set-server = tis620
           collation-server = tis620_thai_ci
           init_connect = 'SET collation_connection = tis620_thai_ci'
           init_connect = 'SET NAMES tis620'

      จากนั้น Restart MySQL

  แล้วคนใช้ UTF-8 จะทำยังไงในเมื่อเรา SET ทุกอย่างเป็น tis620 หมด
    - คนใช้ UTF-8 ต้องมา mysql_db_query($dbname,"SET NAMES UTF8"); เองซะแล้ว !!
      ** ในการ Input ข้อมูลต่างๆใน phpMyAdmin นั้นจะไม่มีผลใดๆ กับผู้ใช้ UTF8

  เมื่อก่อนไม่เห็นมีแบบนี้เลยแล้วเมื่อก่อนให้เลือก character set คืออะไร
    - เมื่อก่อนเป็น Character Set แบบปลอมๆ คือข้อมูลต่างๆที่เก็บลงฐานข้อมูลมันคือ latin1 นั่นเอง
      แล้วทำไม Latin1 มันใช้ภาษาไทยได้หละ แน่นอนอยู่แล้วมันใช้ได้เนื่องจาก latin1 มัน Key map แบบเดียวกะ keyboard ไทย
      และประเทศอื่นๆ ก็เป็น Key Map เดียวกัน แต่สมัยนี้พวกภาษาจะไม่ขึ้นอยู่กับ Key Map ที่เราเห็นอยู่แล้ว (UTF-8)
      *** และที่สำคัญในเวอร์ชั่น 4.0, 3.x มีให้เลือก character set ตรงนั้นไม่ได้มีความหมายว่า เก็บข้อมูลเป็นภาษาไทย
       ความหมายของมันคือ เรียงลำดับภาษาไทย ต่างหาก คนไทยจึงเข้าใจผิดๆ มานาน -_-' กับ tis620 ใน MySQL
      ไม่ก็ลองย้อนไปดูได้ครับแม้ว่าจะเลือก charset เป็น latin1 มันก็เก็บข้อภาษาไทยได้ เพียงแต่เรียงลำดับภาษาไทยไม่ได้เท่านั้น

  แล้วทำไมสมัยนี้ MySQL ทำไมยุ่งยากกว่าเดิมเยอะ
    - มันไม่ได้ยุ่งยากหรอกครับ มันอยู่ที่เราจะปรับตัวมากกว่า อย่ายึดติดกับหนังสือตามห้องสมุด เพราะที่ท่านอ่านมันเป็นความรู้เก่าๆ
      ผมไม่ได้บอกว่าหนังสือที่เค้าขายกํนมันไม่ดีนะครับ เพียงแต่อยากจะบอกว่าที่เค้าขายกัน มันตกยุคไปนานโขแล้ว
      เริ่มต้นทำความเข้าใจกับ MySQL ใหม่ เพราะที่มองเห็นว่ายุ่งยากกว่าเดิมจริงๆ ไม่ใช่ ควรเรียกว่าเป็นทางเลือกใหม่จะเหมาะสมกว่า
      เพราะว่าระดับภาษาของ MySQL จะเจาะลึกลงไปเยอะมากคือ
        - ต้องกำหนดภาษาเมื่อ Connect to Database
        - ต้องกำหนดภาษาเมื่อ Create Database (การเรียงลำดับ)
        - ต้องกำหนดภาษาเมื่อ Create Table (การเรียงลำดับ)
        - ต้องกำหนดภาษาเมื่อ Create Field (การเรียงลำดับ)

  รู้ปัญหามานานแล้วทำไมพึ่งมาบอก ??
    - เพราะผมเลิกใช้ TIS-620 ไปแล้ว ตอนนี้ใช้แต่ UTF-8 ดีกว่าเยอะ !!

  ความเสถียรของ MySQL 5.x เป็นยังไงบ้างเมื่อเทียบกับตัวเวอร์ชั่นเก่าๆ
    - เสถียรกว่าเวอร์ชั่นเก่าๆ มาก ไม่มีอาการ Crash อิดๆ ออดๆ เหมือนแต่ก่อน ดังนั้น แนะนำให้ใช้เป็นอย่างยิ่ง

  PHP5 ทำไมมี Bug เยอะจัง
    - อันนี้ก็เข้าใจผิดๆ อีกเรื่องหนึ่งที่เจอกันเยอะมาก เข้าใหม่เสียว่า ที่ดูเป็น Bug ที่เห็นนั่นแหละ
      คือเราเองเขียน Source Code ผิด เนื่องจาก PHP5 มี Sesnsitive มากๆ เกี่ยวกับการเขียน Code หลังจากที่
      ผมเลือกใช้ PHP5 ผมจึงรู้ว่าสมองอันน้อยนิดที่คิดว่าผมเขียนโปรแกรมถูกนั้น ปรากฏว่าเจอ Error กระจาย
      ต้องมาไล่แก้ code ใหม่อีกครั้ง ซึ่ง Error ที่แจ้งออกมา เราจะเห็นได้ว่าเราเขียนผิดเองจริงๆ และทำให้ผมมองย้อน
      กลับไปที่ PHP4 จึงทำให้รู้ว่า PHP4 นี่แหละที่มี Bug เยอะกว่า PHP5เพราะว่าไม่ยอมแจ้งข้อผิดพลาดขึ้นมาเลย
      ทั้งๆ ที่มีผิดอยู่เห็นๆ บทพิสูจน์นี้ทดสอบบน Domain ที่อยู่ใน Hosting ผมกว่า 60 กว่าโดเมนสามารถทำงาน
      ได้กับ PHP5 ได้อย่างไม่มีปัญหาใดๆ เลยแม้แต่น้อย อีกทั้ง PHP5 ยังทำงานเร็วกว่า PHP4 เพราะเนื่องจากว่า PHP5
      เลือกใช้ Zend Engine 2 นั่นเองจึงทำให้ความเร็วเพิ่มขึ้นมาประมาณ 20% และลด Load CPU ของ Server
      ลงไปเยอะมาก

  แล้วแบบนี้ก็ต้องหันมาใช้ PHP5 แทนที่ PHP4 ใช่ไหม ?
    - อันนี้ขึ้นอยู่กับความชอบของแต่ละคน แต่ถ้าให้ผมแนะนำใช้เถอะครับ เพราะตอนนี้ PHP6 เค้าจะออกมากอีกแล้ว
      แต่ว่าตอนนี้คุณยังไม่ได้เริ่มต้นที่จะทดลองใช้ PHP5 เลย ขืนใช้ PHP4 แล้ว Upgrade เป็น PHP6
      ผมรับประกันได้เลยว่าคุณต้องปวดหัวแบบสุดๆ แน่นอน !! แล้วจะมาบอกอีกไม่ได้ว่า PHP5 และ PHP6 เค้ามี Bug !
      ใช้ PHP4 แทนแล้วกัน ก็ขอยืนยันอีกครั้งว่า Source Code ของคุณจะเป็น Source Code รุ่นโบราณที่สุดในโลก
เด็กไอทีคลับ
เด็กไอทีตัวพ่อ
เด็กไอทีคลับชั้นเซียน
*
พลังความคิด 89
กระทู้: 3,536
บันทึกการเข้า
ไอที
« ตอบ #1 เมื่อ: 29, 08 2009, 10:44:29 AM »
ข้อแนะนำสำหรับโปรแกรมเมอร์ ที่ใช้ภาษา PHP
http://www.dekitclub.com/forum/index.php?topic=1565.0 link

เด็กไอทีคลับ
เด็กไอทีตัวพ่อ
เด็กไอทีคลับชั้นเซียน
*
พลังความคิด 89
กระทู้: 3,536
บันทึกการเข้า
ไอที
« ตอบ #2 เมื่อ: 31, 08 2009, 01:56:04 PM »
ในบอร์ดส่วนนี้ ไม่ค่อยเป็นที่นิยมแหะ ส่วนมากก็เห็นแต่ @dekitclub c]tw,jduj8o
nodtem66
เด็กไอทีคลับหน้าใหม่
*
พลังความคิด 5
กระทู้: 9
บันทึกการเข้า

link
ไอที
« ตอบ #3 เมื่อ: 31, 08 2009, 01:57:34 PM »
ในบอร์ดส่วนนี้ไม่ค่อยเห็นใครเลยแหะ
nodtem66
เด็กไอทีคลับหน้าใหม่
*
พลังความคิด 5
กระทู้: 9
บันทึกการเข้า

link
ไอที
« ตอบ #4 เมื่อ: 1, 09 2009, 11:51:30 AM »
ในบอร์ดส่วนนี้ไม่ค่อยเห็นใครเลยแหะ
ส่วนนี้ผมชอบเข้ามาแอบอ่านครับ แต่ไม่ค่อยมีความเห็นเพราะยังไม่สันทัดพอ
IRONKONG
RUK-YOM
เทพไอทีมาจุติ
*
พลังความคิด 37
กระทู้: 2,486
เว็บไซต์
บันทึกการเข้า

"BN002"
ไอที
« ตอบ #5 เมื่อ: 1, 09 2009, 10:09:50 PM »
ในบอร์ดส่วนนี้ ไม่ค่อยเป็นที่นิยมแหะ ส่วนมากก็เห็นแต่ @dekitclub c]tw,jduj8o

nodtem66 มีอะไรที่อยากนำเสนอ เอามาลงได้เลยนะครับ ^^ เพื่อประโยชน์สุขของมนุษย์ชาติ
เด็กไอทีคลับ
เด็กไอทีตัวพ่อ
เด็กไอทีคลับชั้นเซียน
*
พลังความคิด 89
กระทู้: 3,536
บันทึกการเข้า
ไอที
« ตอบ #6 เมื่อ: 1, 09 2009, 10:37:19 PM »
ในบอร์ดส่วนนี้ ไม่ค่อยเป็นที่นิยมแหะ ส่วนมากก็เห็นแต่ @dekitclub c]tw,jduj8o

nodtem66 มีอะไรที่อยากนำเสนอ เอามาลงได้เลยนะครับ ^^ เพื่อประโยชน์สุขของมนุษย์ชาติ
ผมว่าต้องเติม "และนักศึกษาที่โปรเจคเกี่ยวข้องกับตัวนี้" ด้วยพี่
IRONKONG
RUK-YOM
เทพไอทีมาจุติ
*
พลังความคิด 37
กระทู้: 2,486
เว็บไซต์
บันทึกการเข้า

"BN002"
ไอที
« ตอบ #7 เมื่อ: 2, 09 2009, 11:38:24 PM »
nodtem66 มีอะไรที่อยากนำเสนอ เอามาลงได้เลยนะครับ ^^ เพื่อประโยชน์สุขของมนุษย์ชาติ

ตัวผมความรู้ยังน้อยครับ ไม่กล้าขนาดนั้นหรอกครับ จำเป็นต้องศึกษาอีกเยอะ แต่ถ้าเห็นอะไรดีๆจะเอามา post ให้ครับ
nodtem66
เด็กไอทีคลับหน้าใหม่
*
พลังความคิด 5
กระทู้: 9
บันทึกการเข้า

link
หน้า: [1]  ขึ้นบน
  พิมพ์  
 
กระโดดไป: