หน้าเว็บ

วันอังคารที่ 6 กันยายน พ.ศ. 2554

PostgreSQL กับการเรียงลำดับภาษาไทย


PostgreSQL นั้นถ้าติดตั้งแบบ default จะไม่สามารถเรียงลำดับภาษาไทยได้ถูกต้อง เพราะค่าเริ่มต้นตั้งมาให้เป็นภาษาอังกฤษทั้งหมด
Windows
ถ้าเป็นบน Windows ก็สามารถแก้ไขได้ง่ายหน่อย โดยการเลือก Locale ตอนที่ติดตั้งให้เป็นภาษาไทย ตามรูป
Ubuntu: PostgreSQL 8.3
บน Ubuntu จะยุ่งยากกว่าบน Windows หน่อย เพราะไม่มีตัวติดตั้งแบบนั้น
ในกรณีของ PostgreSQL 8.3 และก่อนหน้านั้น locale จะผูกกับ database cluster เลย ไม่สามารถแก้ไขได้ และไม่สามารถตั้งแต่ละ database ให้มี locale ต่างกันได้ ดังนั้นการตั้ง locale ก็จะต้องตั้งในตอนที่สร้าง database cluster ด้วยคำสั่ง initdb เท่านั้น
ปกติแล้วตอนที่เราติดตั้ง PostgreSQL นั้น Ubuntu ก็จะสั่ง initdb เพื่อสร้าง cluster ให้อยู่แล้ว โดย initdb นั้นจะดูค่า locale ที่สร้างให้กับ cluster ตาม environment locale ของ user ที่สั่ง ดังนั้นถ้าเราต้องการติดตั้ง PostgreSQL ให้เรียงลำดับไทยได้ วิธีที่ง่ายที่สุดก็คือ
$ export LANG=th_TH.UTF-8
$ sudo apt-get install postgresql
สำหรับเครื่องที่ติดตั้งไปแล้ว ง่ายที่สุดคือ remove ตัวที่ติดตั้งไปออก แล้วติดตั้งใหม่ตามคำสั่งข้างต้น หรือไม่ก็ต้องสั่ง initdb ใหม่เอาเอง
 การเพิ่ม Locale ไทย
ในกรณีที่เราลงแบบ Server หรือ JeOS แล้วไม่ได้เลือกภาษาไทยไว้แต่แรกนั้น ก็จะต้องเพิ่ม locale ภาษาไทยก่อน โดยสั่ง

$ sudo locale-gen th_TH.UTF-8

โดยเราสามารถตรวจสอบ locale ที่ support ทั้งหมดได้ด้วยคำสั่ง
$ locale -a
Ubuntu: PostgreSQL 8.4
PostgreSQL 8.4 นั้นได้เพิ่มความสามารถในการตั้ง locale เป็นอิสระสำหรับแต่ละฐานข้อมูลแล้ว ดังนั้นการจะสร้างฐานข้อมูลให้เรียงลำดับภาษาไทยถูกต้อง ก็แค่ตั้ง locale ให้ถูกตอนที่สั่ง createdb ดังนี้
$ createdb -l th_TH.UTF-8 -E UTF-8 -T templat0 mydatabase
(ที่ต้องใส่ -T template0 ด้วย เพราะว่า default template คือ template1 นั้นตั้ง locale มาเป็น en_US ถ้าตอนที่เราติดตั้ง postgres นั้นเราไม่ได้ติดตั้งด้วย locale Thai)
หรือถ้าอยากให้ทุกฐานมี default เป็นไทย ก็ทำตามใน 8.3 ได้เลย
การตรวจสอบ Locale ของ PostgreSQL
การตรวจสอบว่า server/database ของเราใช้ locale อะไรนั้น สามารถดูได้จากคำสั่ง SHOW ของ PostgreSQL แล้วดูตัวแปร lc_* เช่น
$ psql -c "show all" | grep lc_
หรือถ้าจะดูเฉพาะเรื่องการเรียงลำดับ ก็ใส่ตรงๆ ไปเลยก็ได้
$ psql -c "show lc_collate"
ส่วนใน PostgreSQL 8.4 นั้นสามารถมี Locale ต่างกันของแต่ละฐานได้ ดังนั้นเราต้องระบุฐานข้อมูลที่ต้องการตรวจสอบด้วย
$ psql -d mydatabase -c "show all" | grep lc_
ถ้าตรวจดูแล้ว lc_collate เป็น th_TH.UTF-8 ก็แสดงว่าฐานของเราตั้งให้เรียงลำดับไทยถูกต้องแล้ว

ที่มา http://pongtawat.exteen.com/20100324/postgresql








ไม่มีความคิดเห็น:

แสดงความคิดเห็น