ข้อแนะนำในการใช้ความสามารถทางด้านภาษาไทยจาก
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"
maxdatafiles 254
maxinstances 8
maxlogfiles 32
character set TH8TISASCII
national character set UTF8
DATAFILE
'/u01/oradata/viper/system01.dbf' SIZE 100M AUTOEXTEND
ON NEXT 640K
Logfile
'/u01/oradata/viper/redo01.log' SIZE 500K,
'/u01/oradata/viper/redo02.log' SIZE 500K,
'/u01/oradata/viper/redo03.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;
SYSDATE
-----------
30-MAR-2002 |
วิธีการบังคับรูปแบบการแสดงผลใน
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
or
NLS_LANG=AMERICAN_AMERICA.TH8TISASCII
or
NLS_LANG=THAI_AMERICA.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
Keywords:
NLS
NLS_LANG CREATE NLSSORT TH8TISASCII UTF8
|