ข้อแนะนำในการใช้ความสามารถทางด้านภาษาไทยจาก Oracle Database
Prerequisites: (Software Requirements)
Oracle Software ซึ่งสามารถ Download ได้จาก http://otn.oracle.com
Assumption: -
Notation: -
Attendees:
Oracle DBA, Oracle Developer
Purpose:
อธิบายการใช้งานความสามารถด้านภาษาไทยของ Oracle Database
Introduction:
เอกสารฉบับนี้ได้อธิบายลำดับขั้นตอนที่สำคัญในการใช้งาน ความสามารถด้านภาษาไทย ของ Oracle Database ดังรายละเอียดต่อไปนี้
Planning and selecting appropriated database character set
ก่อนอื่นDBA ควรวางแผนและกำหนด Character Set ของ Oracle Database ให้เหมาะสมกับลักษณะงานที่พัฒนา ในกรณีที่เราวางแผนที่จะจัดเก็บข้อมูลที่เป็นภาษาไทย และภาษาอังกฤษใน Database เดียวกัน Character Set ที่เหมาะสมควรเป็น TH8TISASCII
ถ้าเรากำหนดเป็น US7ASCII หรือ WE8ISO8859P1 เราก็สามารถที่จัดเก็บ ดึงข้อมูล และเรียงลำดับข้อมูลที่เป็นภาษาไทยได้เช่นกัน เพียงแต่ในการทำงานของ Oracle Database อาจจะต้องเพิ่มขั้นตอนในการ Encoding กลับไป กลับมาหลายตลบ ซึ่งมีผลโดยตรงต่อ Performance
แต่ถ้าเราวางแผนให้ Database ของเรารองรับหลายภาษา การเลือก Character Set เป็น Unicode ก็จะเหมาะสมอย่างยิ่งกับระบบงานเช่นนี้ Character Set ที่เหมาะสมก็จะเป็น UTF8 หรือ UTF16 (เริ่มมีใช้ใน Oracle Database 9.0.1) ก็ได้
Server Side
ข้อแนะนำฝั่ง Database Server
1. Creating new Database
เราอาจสร้าง Database ได้โดยใช้ Database Configuration Assistant – DBCA ซึ่งเป็น GUI หรืออาจสร้างโดยใช้คำสั่ง Create Database จาก SQL*Plus ก็ได้
ในการสร้าง Database นั้น ต้องมีการระบุ Character Set ที่ต้องการใช้ โดย Character Set นี้ จะมีผลกับ Datatype อย่างเช่น char, varchar2 เป็นต้น ส่วน National Character Set จะมีผลกับ Datatype อย่างเช่น nchar, nvarchar2 เป็นต้น
|
CREATE DATABASE "viper" DATAFILE Logfile '/u01/oradata/viper/redo01.log' SIZE 500K, |
จากตัวอย่างข้างบน จะเป็นการสร้าง Database ชื่อ "viper" โดยใช้ Character Set เป็น "TH8TISASCII" ซึ่งก็คือ ข้อมูลที่ถูกจัดเก็บเป็นข้อมูลภาษาไทย ตามรหัส สมอ (TIS) มีวิธีการเก็บแบบ Single Byte 8 Bits และข้อมูลนี้ถูกจัดเก็บในลักษณะ ASCII Code
และ Database "viper" สามารถที่จะจัดเก็บข้อมูลที่มี Datatype ที่เป็น National Character Set เช่น nchar, nvarchar2 โดยการ Encode ในรูปแบบ UTF8
2. How to check current database character set **
เราสามารถตรวจสอบ Database Character Set ที่เรากำลังใช้งานอยู่ ได้โดยใช้คำสั่งข้างล่างนี้
| SQL> select * from nls_database_parameters; |
3. How to change database character set **
การเปลี่ยน Database Character Set สามารถทำได้ในกรณีที่ Character Set ที่เรากำหนดไว้ จะต้องการมีขนาดเล็กกว่า Character Set ที่เราจะเปลี่ยนใหม่เท่านั้น ตัวอย่างเช่น เปลี่ยน US7ASCII ให้เป็น TH8TISASCII ได้ แต่ไม่สามารถเปลี่ยน TH8TISASCII เป็น US7ASCII ได้
ดังนั้นในการออกแบบ Database Character Set ควรจะมีการไตร่ตรอง ปรึกษา และตกลงเรื่องการกำหนด Database Character Set ให้ดีก่อน เพราะ Database Character Set มีผลต่อ Performance อย่างมาก และการเปลี่ยนแปลงภายหลังก็ไม่สามารถทำได้ทุกกรณี
ตัวอย่างคำสั่งในการเปลี่ยน Database Character Set
| SQL> alter database fujudb character set TH8TISASCII; |
Client Side **
ข้อแนะนำที่ฝั่ง Client
เพื่อให้การ Encode ข้อมูลที่ฝั่ง Client ทำงานได้อย่างถูกต้อง และตรงกันกับ Database Character Set ที่กำหนดไว้ที่ฝั่ง Server เราสามารถกำหนด NLS Parameter ได้ 3 ระดับด้วยกัน คือ
- Database Level เราสามารถกำหนดค่า NLS parameter ที่ init.ora ซึ่งอยู่ที่ฝั่ง Server ให้เป็นค่า default ซึ่งการกำหนดเช่นนี้ จะมีผลกับทุกๆ Client ที่ไม่ได้กำหนดค่า NLS Parameter ไว้
- Environment Level จะเป็นการกำหนด NLS Parameter ไว้ที่ Environment Variable ซึ่งจะมีผลเมื่อ Client Program ทำการเรียกใช้
- Session Level เป็นการกำหนด NLS Parameter หลังจากที่มีการ Connect และ Create Session กับ Database Server เรียบร้อยแล้ว
ตัวอย่าง
จาก SQL*Plus เราต้องการให้ Current Date แสดงในรูปแบบดังต่อไปนี้
SQL> select sysdate from dual; |
วิธีการบังคับรูปแบบการแสดงผลใน Level ต่างๆ สามารถทำได้ดังนี้
Database Level
เพิ่มบรรทัดข้างล่างนี้ ใน Init.ora และทำการ Restart Database Server ใหม่
NLS_DATE_FORMAT=DD-MON-YYYY |
Environment Level
ในกรณีที่เป็น Unix กำหนดในระดับตัวแปรของ Shell
$ NLS_DATE_FORMAT=DD-MON-YYYY;export NLS_DATE_FORMAT |
Session level
ใช้คำสั่ง
SQL>alter session set NLS_DATE_FORMAT='DD-MON-YYYY'; |
4. Set Client Environment for Thai Support **
4.1 NLS_LANG - Basic theory (should be the same character set as Server side)
ตัวแปร NLS_LANG ประกอบด้วย 3 ส่วนด้วยกัน คือ Language, Territory และ Character Set ซึ่งอยู่ในรูปแบบ
NLS_LANG = language_territory.charset
กติกาง่ายๆ คือ กำหนดส่วนของ Character Set ในตัวแปร NLS_LANG ให้ตรงกับ Database Character Set ปัจจุบัน เพื่อป้องกันปัญหาการ Encode ข้อมูลผิด อย่างเช่น แสดงข้อมูลออกมาเป็น '??????' หรือ 'ฟฟฟฟฟ'
ตัวอย่างเช่น ถ้า Database ที่เราสร้างขึ้นมามี Character Set เป็น TH8TISASCII ดังนั้นการกำหนดค่า NLS_LANG ของ Client ก็อาจจะกำหนดได้ดังตัวอย่างข้างล่างนี้ ซึ่งผลที่ได้จะทำให้ไม่มีปัญหาเกี่ยวกับการ Encode ข้อมูลผิดเป็น '??????' หรือ 'ฟฟฟฟฟ'
NLS_LANG=THAI_THAILAND.TH8TISASCII |
4.2 Thai Sorting
เราสามารถกำหนดการ Sort ของภาษาไทยได้ที่ระดับ NLS Parameter โดยใช้คำสั่ง
SQL>alter session set NLS_SORT=THAI_DICTIONARY; |
นอกจากนี้ เรายังสามารถที่จะระบุ Dictionary สำหรับการ Sort ในระดับ SQL Command ได้โดยใช้ Function NLSSORT
ตัวอย่างเช่น
SQL>SELECT * FROM myTable ORDER BY NLSSORT(name, 'NLS_SORT = THAI_DICTIONARY'); |
Sample Client Programs for using Thai Support Features
Multi-tier
1. PHP via OCI8 extension
2. JSP via JDBC
Two-tier
3. ODBC
Using Oracle Client Program/Utility
1. Imp/Exp utility
2. SQL*Plus
Note:
N/A
Complete Sample code:
ตัวอย่างข้อมูล และการใช้ NLSSort Function
References:
1. Oracle9i Globalization Support Guide Release 1 (9.0.1) Part Number A90236-02
More Information:
**1. รายละเอียด คำอธิบาย และตัวอย่างการกำหนดค่า NLS Parameter ที่จำเป็นสำหรับภาษาไทย สามารถอ่านเพิ่มเติมได้ที่เอกสารนี้ " http://www.exzilla.net/docs/nls/oracleNLS01.php "
2. Oracle9i Globalization Support Guide Release 1 (9.0.1) Part Number A90236-02