สำหรับคนที่เพิ่งเริ่มเล่น 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 ครับ
โดยแก้ไขตรงส่วนนี้ ให้เป็น
- ถ้ามีการติดต่อฐานข้อมูล ให้เพิ่มในส่วนของ mysql_db_query($dbname,"SET NAMES UTF8");
- หรือ mysql_query("SET NAMES UTF8");
* connection ตรงนี้หมายถึงว่า ทุกครั้งที่มีการติดต่อ ให้เรา เพิ่มบรรทัดนี้เข้าไปครับ ไม่ว่าจะ select, update
หรือถ้าใครที่ทำมาแบบนี้ก็ ใส่กันแค่ทีเดียวครับ
$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
??????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????
เวลาดึงฐานข้อมูลจาก 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 รุ่นโบราณที่สุดในโลก
0 ความคิดเห็น:
แสดงความคิดเห็น