ปัญหาภาษาไทยกับ กับ Mysql
วิธีแก้ 1 กำหนด Database ให้ใช้ tis620
แก้ไขไฟล์ config ของ MySQL โดยการกำหนดค่าดังนี้
CODE
[mysqld]
default-character-set=tis-620
default-character-set=tis-620
บน Linux จะอยู่ที่ etc/my.cnf
บน Windows จะอยู่ที่ windows/my.ini
restart MySQL อีกครั้งหนึ่ง ตรวจสอบให้แน่ใจว่า default character เป็น tis620 แล้ว
ตัวอย่าง การตรวจสอบ ด้วยคำสั่ง s ใน mysql client บน Windows
QUOTE
mysql> s
--------------
mysql Ver 14.12 Distrib 5.0.18, for Win32 (ia32)
Connection id: 2
Current database:
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.0.18
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: tis620
Db characterset: tis620
Client characterset: latin1
Conn. characterset: latin1
TCP port: 3306
Uptime: 30 sec
Threads: 1 Questions: 3 Slow queries: 0 Opens: 0 Flush tables: 1 Open table
s: 3 Queries per second avg: 0.100
--------------
--------------
mysql Ver 14.12 Distrib 5.0.18, for Win32 (ia32)
Connection id: 2
Current database:
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.0.18
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: tis620
Db characterset: tis620
Client characterset: latin1
Conn. characterset: latin1
TCP port: 3306
Uptime: 30 sec
Threads: 1 Questions: 3 Slow queries: 0 Opens: 0 Flush tables: 1 Open table
s: 3 Queries per second avg: 0.100
--------------
ตัวอย่าง การตรวจสอบ ด้วยคำสั่ง s ใน mysql client บน Linux
QUOTE
mysql Ver 14.7 Distrib 4.1.7, for redhat-linux-gnu (i386)
Connection id: 3
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 4.1.7
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: tis620
Client characterset: tis620
Conn. characterset: latin1
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 5 sec
Threads: 1 Questions: 5 Slow queries: 0 Opens: 11 Flush tables: 1 Open tables: 0 Queries per second avg: 1.000
--------------
Connection id: 3
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 4.1.7
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: tis620
Client characterset: tis620
Conn. characterset: latin1
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 5 sec
Threads: 1 Questions: 5 Slow queries: 0 Opens: 11 Flush tables: 1 Open tables: 0 Queries per second avg: 1.000
--------------
นอกจากนี้เราสามารถใช้ MySQL Client tool อื่นๆ สำหรับตรวจสอบได้เช่นกัน
ตัวอย่างค่า default เริ่มแรก
เมื่อปรับค่า default เป็น tis620
ดังนั้น ตัวแปลดังกล่าว ควรจะมีค่าตังนี้
QUOTE
- character_set_client = tis620
- character_set_connection = tis620
- character_set_database = tis620
- character_set_results = tis620
- character_set_server = tis620
- character_set_system = utf8
- collation_connection = tis620_thai_ci
- collation_database = tis620_thai_ci
- collation_server = tis620_thai_ci
- character_set_connection = tis620
- character_set_database = tis620
- character_set_results = tis620
- character_set_server = tis620
- character_set_system = utf8
- collation_connection = tis620_thai_ci
- collation_database = tis620_thai_ci
- collation_server = tis620_thai_ci
character set กับ collation ??
character set คือรูปแบบของการจัดเก็บข้อมูล เราสามารถดูรูปแบบที่ MySQL สนับสนุนการใช้งานได้จาก คำสั่ง SHOW CHARACTER SET;
collation คือรูปแบบของการจัดเรียงและเปรียบเทียบ รูปแบบการจัดเรียงที่มักใช้กันบ่อยๆ มักลงท้ายด้วย ci ,cs, bin (เรียงตามลำดับ) เราสามารถดูรายชื่อ collation ที่สนับสนุนได้จาก SHOW COLLATION;
ci, cs, bin ?? มีความหมายดังนี้
ci = case-insensitive จัดเรียงตามตัวอักษร มองตัวอักษรใหญ่ และเล็กมีความสำคัญเท่ากัน โดยปกติมักจะใช้ collation แบบ ci
cs = case sensitive จัดเรียงโดยให้ความสำคัญกับอักษรตัวใหญ่ มากกว่าตัวเล็ก เช่น Z จะมาก่อน a
bin = binary ใช้สำหรับการเปรียบเทียบ
2. บอกให้ mysql รู้ถึงรูปแบบของภาษาที่ต้องการใช้ ผ่าน sql command
เราสามารถใช้คำสั่ง SET เพื่อกำหนดค่าตัวแปลของ MySQL ได้
ดังนั้น ก่อนที่จะ insert, update เราต้องบอกให้ MySQL ทราบถึงรูปแบบของภาษาที่ใช้ ยกตัวอย่างเช่น
CODE
mysql_query("SET NAMES 'tis620' ");
mysql_query("SELECT * FROM TEST");
mysql_query("SELECT * FROM TEST");
(UPDATE - 2006.02.08)
ยังมีอีกวิธีหนึ่งคือ แนบคำสั่งไปกับประโยค SQL เลย เช่น
CODE
mysql_query("SELECT * FROM TEST ORDER BY idRec COLLATE tis620_thai_ci");
Thanks : Patrickz 2.0
Links
MySQL : Chapter 10. Character Set Support
เมื่ออักษรภาษาไทยกลายเป็น ?????? (phpconcept.com)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น