แก้ปัญหาภาษาไทยของ MySQL Version 4.x ขึ้นไป

อย่างแรกที่เจอปัญหาใน MySQL 5.0 คือถึงแม้จะกำหนด default-character-set เป็น utf8 แล้วก็ตามที แต่ก็ยังคงมีปัญหากับการจัดการข้อมูลภาษาไทยครับ

ซึ่งเราต้องปรับเปลี่ยนพฤติกรรมของตนเองใหม่เล็กน้อย 3 อย่างใหญ่ ๆ ครับ

  1. กำหนด collation_connection หรือ collation (ถ้าคุณใช้ PHPMyAdmin ที่เป็น interface ภาษาไทยก็จะเรียกว่า "การเรียงลำดับ" ครับ) ของ Database และ Table ที่เราใช้ต้องเป็น utf8_thai_ci เพื่อบอกว่าเราต้องการใช้ภาษาไทยกับ Database และ Table นี้ครับ
  2. กำหนด DEFAULT CHARSET ของ Database และ Table ที่เราใช้ต้องเป็น utf8 เพื่อบอกว่าเราต้องการใช้ภาษาไทยกับ Database และ Table นี้ครับ
  3. กำหนด Storage Engine ให้กับ Table ด้วย เพื่อจะได้ใช้งานได้ดี และเหมาะสมกับการเข้าถึงข้อมูลครับ เช่นต้องการควบคุม Transaction ของข้อมูลก็ใช้ BDB หรือ InnoDB เป็นต้นครับ

ตัวอย่างเช่น

CREATE DATABASE TESTDB
    DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE TEST (
  name VARCHAR(150) NOT NULL,
  PRIMARY KEY(name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

โดยที่ ENGINE=InnoDB เป็น Storage Engine หนึ่งของ MySQL ส่วนใหญ่จะใช้ MySIAM กันจะเป็น ENGINE=MySIAM แทนครับ

ส่วน DEFAULT CHARSET=utf8 นี่ต้องตามนี้ครับ แต่ว่าเท่าที่เจอกันจะเป็น DEFAULT CHARSET=utf8 หรืออื่นๆ ซะมากกว่าครับ ลองดูนะครับ

หรือถ้า Database และ Table เก่าเรามีปัญหาไม่สามารถปรับเปลี่ยนได้ ก็ให้กำหนดตอนก่อนจะ Query ข้อมูลก็ทำได้ครับ โดยใช้คำสั่ง

SET CHARACTER SET utf8;

และตามด้วย

SET collation_connection = utf8_general_ci;

แล้วทำการ Query ข้อมูลครับ

แก้ไขปัญหา Client does not support authentication protocol ใน MySQL

ใน MySQL 4.1 ขึ้นไปนั้น ได้ใช้ hashing algorithm ในการเก็บ password เพื่อใช้ในการ Authentication Protocol แบบใหม่ซึ่งทำให้ยังไม่สนับสนุนใน PHP หรือ software client ใน version เก่าๆ (หรือใหม่ๆ บางตัวก็ยังไม่สนับสนุน) ถ้าคุณ upgrade ไปเป็น MySQL 4.1 หรือสูงกว่า การติดต่อเพื่อเข้าไปใช้งานนั้น จะขึ้นข้อความว่า

Client does not support authentication protocol requested by server; consider upgrading MySQL client.

สาเหตุมาจากการที่ MySQL ได้ทำการปรับเปลี่ยนการเข้ารหัส password ใหม่อย่างที่ได้กล่าวไปแล้วโดย ถ้าใน MySQL version ก่อน 4.1 นั้นใช้การเข้ารหัสที่มีความยาว 16 bytes แต่ใน version ตั้งแต่ 4.1 ขึ้นมาถึงปัจจุบันนี้จะใช้การเข้ารหัสที่มีความยาว 41 bytes ซึ่ง client บางตัวยังไม่สนับสนุน password hashing algorithm แบบนี้ครับ ซึ่งการเข้ารหัส password ที่มีความยาว 41bytes นี้จะทำให้การถอดรหัสเพื่อทำการ hack ข้อมูลนั้นทำได้ยากขึ้นมากเลยทีเดียวครับ 

โดยถ้าเราเปรียบเทียบจากตัวก่อนหน้า version 4.1 จะได้

mysql> SELECT PASSWORD(‘mypass’);
+——————–+
| PASSWORD(‘mypass’) |
+——————–+
| 6f8c114b58f2ce9e |
+——————–+

แต่ถ้าเราใช้คำสั่งเดียวกันใน version หลังจาก 4.1 จะได้

mysql> SELECT PASSWORD(‘mypass’);
+———————————————–+
| PASSWORD(‘mypass’) |
+———————————————–+
| *43c8aa34cdc98eddd3de1fe9a9c2c2a9f92bb2098d75 |
+———————————————–+

จะเห็นความแตกต่างของการเข้ารหัส password ของ MySQL ครับ

การแก้ไขปัญหานี้ทำได้โดยการ

  • ทำการ upgrade ตัว client ที่ติดต่อกับ MySQL ให้เป็น version ที่สนับสนุน hashing algorithm ที่เก็บ password ใหม่ใน MySQL 4.1 ขึ้นไป (client ที่ว่านี้หมายถึง PHP MySQL Module, MySQL Front, PHPMyAdmin และตัวจัดการข้อมูลต่างๆ ที่เชื่อมต่อกับ MySQL ถือเป็น client ทั้งหมดครับ)

  • เมื่อทำการติดต่อกับ server โดยใช้ pre-4.1 client program ให้ใช้บัญชี username ที่ใช้ pre-4.1-style password แทนการใช้ username ที่ใช้ style password แบบเก่า

  • ทำการ Reset password ไปเป็น pre-4.1 style โดยใช้คำสั่ง SET PASSWORD และ OLD_PASSWORD() function โดยทำใน MySQL Command Line Client ซึ่งใช้คำสั่งดังนี้

mysql> SET PASSWORD FOR

-> ‘some_user‘@’some_host‘ = OLD_PASSWORD(‘newpwd‘);

  • some_host ให้เปลี่ยนเป็น hostname ที่ใช้เช่น localhost, 127.0.0.1, 192.168.0.1 หรือที่เป็น hostname นั้นๆ
  • some_user ให้เปลี่ยนเป็น username ที่ใช้เช่น root, admin หรือ username อื่นๆ ที่ต้องการ
  • newpwd ให้เป็นเป็น password ที่ใช้เช่น 1234, abcde หรือที่ต้องการ

ตัวอย่าง :

mysql> SET PASSWORD FOR

-> ‘root‘@’localhost‘ = OLD_PASSWORD(‘1234‘);

คือกำหนด password ใหม่ให้กับ root ที่ localhost โดยใช้ hashing algorithm password แบบเก่าโดยกำหนด password คือ 1234

แล้วทำการ UPDATE และ FLUSH PRIVILEGES โดยใช้สั่ง

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘newpwd‘)

-> WHERE Host = ‘some_host‘ AND User = ‘some_user‘;

mysql> FLUSH PRIVILEGES;

ตัวอย่าง :

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘1234‘)

-> WHERE Host = ‘localhost‘ AND User = ‘root‘;

mysql> FLUSH PRIVILEGES;

* ด้วยวิธีด้านบนนี้เหมาะสำหรับใช้ในกรณีที่มี user ที่อยู่ในฐานข้อมูลน้อยๆ เท่านั้น มิเช่นนั้นแล้วอาจจะต้องเปลี่ยนกันมืองึก -_-"

  • ถ้ามี user ในฐานข้อมูลมากๆ และการปรับเปลี่ยนวิธีด้านบนทั้งหมดเป็นการยากในการทำระบบฐานข้อมูลกลับมาใช้งานได้ปกติในเวลาอันสั้น เราสามารถบอกให้ MySQL ใช้ password hashing algorithm แบบเก่าตอน start-up service ได้เลย แต่แนะนำให้ใช้งานชั่วคราวเท่านั้นครับ และเมื่อมีเวลาให้ทำการปรับเปลี่ยนไปใช้ระบบ password hashing algorithm แบบใหม่แทน

    โดยเริ่มการทำงานของ mysqld ด้วย –old-passwords ที่เป็น option command

    ตัวอย่าง :

    c:\MySQL\bin\mysqld –old-passwords

อ้างอิงจาก A.2.3. Client does not support authentication protocol ใน MySQL 5.0 Reference Manual

MySQL 5.0 (build 15) Full Release !!!

อาจจะเก่าไปนิดแต่ว่าไม่น่าจะนานมาก เมื่อวันที่ 24 ตุลาคม 2548 ที่ผ่านมา MySQL AB ได้เปิดตัว MySQL 5.0 ซึ่งเป็นการเปลี่ยนแปลงครั้งใหญ่ในรอบหลายๆ ปีของ MySQL AB เลยทีเดียว เพราะว่าตัว MySQL 5.0 นั้นมีคุณสมบัติในระดับองค์กร (Enterprise) ซึ่งต้องการความน่าเชื่อถือสูงมาก ตามมาตรฐาน SQL 2003 เลยทีเดียว โดยคุณสมบัติที่เพิ่มเติม มาก็ได้แก่ Stored Procedures, SQL Functions, Triggers, Views, Cursors, XA Distributed Transactions, ตัวเลือกระบบบีบอัดข้อมูล (federated and archive storage options), SQL Mode, ฯลฯ อ่านเพิ่มเติมที่นี่ครับ http://dev.mysql.com/doc/refman/5.0/en/mysql-5-0-nutshell.html

ซึ่งทำงานได้บน Linux, Windows, Solaris, Mac OS X, FreeBSD, HP-UX, IBM AIX 5L, ฯลฯ

MySQL 5.0 นี่อยู่บนข้อตกลง Open Source (GPL) หรือ Commercial MySQL Licenses ซึ่งทำงานตาม concept ของเค้าว่า high-performance, reliability และ ease-of-use ครับ

เพราะว่าตอนนี้ MySQL ไม่เหมือนเมื่อก่อนแล้วครับ ในด้านการจัดการระบบต่างๆ นั้นแทบจะไม่ต้อง set ผ่าน text files แบบเดิมๆ ครับ ทำงานผ่าน wizard ได้เลย ส่วนถ้าต้องการละเอียดมากขึ้นก็ไปโหลด MySQL Administrator จากเว็บ MySQL มาเพื่มเพื่อทำงาน และปรับแต่งต่างๆ ได้ทั้งหมดครับ รวมไปถึงเครื่องมือในการทดสอบ Query ข้อมูล MySQL Query Browser เพื่อทดสอบ SQL ที่เราจะทำงานได้จากซอต์แวร์นี้ครับ ทำงานได้ง่ายมากๆ เลยครับ และส่วนใครจะทำการย้ายฐานข้อมูล MySQL ก็ใช้เครื่องมือ MySQL Migration Toolkit ได้อีกเช่นกันครับ อันนี้ยังไม่ได้ลองทดสอบแต่อย่างใด ถ้าใครใช้แล้วเป็นยังไง ก็ Comment ไว้ครับ

จากที่ได้ลองใช้ดูนั้น การทำงานถือว่าเสถียรดีมาก แต่ว่าผมยังไม่ได้ลองให้มันทำงาน load สุดๆ เลยยังไม่รู้ว่าจะเสถียรกว่าตัวเก่าหรือเปล่า แต่ด้วยระบบที่ใหม่กว่า ไม่น่าจะมีอะไรผิดพลาดแต่อย่างใด

ในการใช้งานตอนนี้ของผมนั้นทำงานบน Storage Engine แบบ InnoDB เพราะว่าผมต้องใช้งาน Transaction ของ DBMS ด้วย ซึ่งจากตัว MySQL 4.1.13 ที่ได้ใช้มาก่อนหน้านี้ก็ทำงานได้ไม่มีที่ติ


อันนี้แนะนำเพิ่มเติมครับ เป็นเครื่องมือในการออกแบบ Database ที่มีประสิทธิภาพมากๆ ตัวหนึ่งเลยทีเดียวครับ มันชื่อว่า fabFORCE DBDesigner 4 (http://www.fabforce.net/) ครับ เจ้า DBDesigner 4 มันเป็นระบบออกแบบฐานข้อมูลแบบเสมื่อนจริง (Visual Database Design System) ที่ดีมากๆ เลย ซึ่งเหมาะสำหรับการออกแบบและการสร้างฐานข้อมูลในรูปแบบ ER-Diagram ซึ่งสามารถทำการจัดการได้โดยตรงจาก Model ได้เลย แถมเชื่อโยงความสัมพันธ์ได้ง่ายมากๆ เลยครับ รวมไปถึง Export ให้ทำงานร่วมกับฐานข้อมูล MySQL, Oracle, MSSQL, SQLite และ ODBC

ซึ่งซอฟค์แวร์ตัวนี้อยู่บนข้อตกลงของ Open Source Project (GPL) สนับสนุนการทำงานบน Microsoft Windows 2k/XP และ Linux KDE/Gnome

โดยที่ความต้องการของระบบในการทำงานนั้นน้อยมาก ไม่ต้องใช้ระบบที่สูงมากนัก แถมทำงานได้เร็วอีกต่างหาก ไม่แฮงง่ายด้วยครับ


แต่ทั้งนี้ทั้งนั้น ถึงแม้จะมี Toosl มาช่วยให้เราบริหารระบบ DBMS มากมายแค่ไหน ถ้าเราไม่เข้าใจว่าเราจะเอามันมาใช้งานยังไงให้เกิดประโยชน์สูงสุดแล้ว ผมว่าก็น่าเสียดายความสามารถเหล่านั้น แถมความสามารถเหล่านี้ก็ไม่ต้องซื้อหาจากที่ไหน เพราะว่าทั้งหลายทั้งบวงที่ได้กล่าวมานั้นอยู่บนข้อกำหนด GPL แทบทั้งสิ้นครับ