วันพฤหัสบดี, ธันวาคม 22, 2548

ต้นตอของปัญหา

ในที่สุดก็ค้นหาคำตอบจนได้ว่าทำไม PostgreSQL 8.0.3 ที่คอมไพล์เองบนเครื่องที่เอาไว้ทำเป็นมิเรอร์ถึงไม่สนับสนุนเรื่อง multibyte ก็เป็นเรื่องที่คาใจมาตลอดระยะเวลาหลายสัปดาห์ ว่าทำไม ....


ขอย้อนกลับไปนิดนึงว่าปัญหาที่เกิดขึ้นเป็นอย่างไร


postgres@phoenix:/etc/postgresql/8.1/main$ psql reportdb_v3
Welcome to psql 8.1.0, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

reportdb_v3=# select item_common_name From b_item where LOWER(item_common_nam e) LIKE '%cpm%';
item_common_name
---------------------------------
CPM .-inj ( 10 mg./ml. ) *
CPM .-tab ( 4 mg. )*
CPM .-Syr (2mg./5ml.) - 60ml.
CPM hand
CPM Elbow
CPM
(6 rows)

reportdb_v3=# select item_common_name From b_item where UPPER(item_common_nam e) LIKE '%cpm%';
ERROR: invalid multibyte character for locale
reportdb_v3=#

และเมื่อลองดูตัวแปรที่เกี่ยวข้องก็ได้ตามนี้

postgres@phoenix:/etc/postgresql/8.1/main$ cat /etc/environment
LANGUAGE="en_TH:en_US:en_GB:en"

LANG=en_US.UTF-8



ไปค้นดูใน กูเกิล ด้วย keyword error+multibyte+locale site:postgresql.org ก็พบว่ามีคนเคยเจอเหมือนเรา ที่นี่ วิธีการแก้ปัญหาของเค้าคือ

  1. ก่อนทำการคอมไพล์ Postgres ให้ export LANG=en_US.UTF-8 ซะก่อน แล้วค่อยทำการ ./configure ; make ;make install ไปตามลำดับ

  2. ต่อเมื่อจะ initialize database ให้เพิ่ม option --locale=C ไปด้วย
    For Example
    postgres@mirror:$/usr/local/pgsql/bin/initdb -E UNICODE --locale=C -D /usr/local/pgsql/data


เมื่อเราทำการทดสอบดูก็ได้ผลตามนี้

เทสต์แล้วครับ บนเครื่องที่ใช้ทำงานจริง work work work ดูการ select ซะก่อน
postgres@mirror:~/tmp$ /usr/local/pgsql/bin/psql v3_repl_db
Welcome to psql 8.0.3, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

v3_repl_db=# select item_common_name from b_item where UPPER(item_common_name) like '%cpm%';
item_common_name
------------------
(0 rows)

v3_repl_db=# select item_common_name from b_item where LOWER(item_common_name) like '%cpm%';
item_common_name
---------------------------------
CPM .-inj ( 10 mg./ml. ) *
CPM .-tab ( 4 mg. )*
CPM .-Syr (2mg./5ml.) - 60ml.
CPM hand
CPM Elbow
CPM
(6 rows)

v3_repl_db=#

จริงๆ ผมก็พึ่งนึกได้ว่าตอนที่ลง postgres จากแพกเกจของเดเบียนน่ะ ก่อนที่เค้าจะ initdb น่ะเค้าก็ถามเหมือนกันว่าจะใช้ locale เป็น C หรือว่า en_US ไอ้เราความที่เคยตัวซะชินก็ Enter ผ่าน (Enter ผ่านแล้วมันไม่มี error เรื่องนี้) เอ้อก็ต้องขอโทษขอโพยด้วยที่ไปนึกเหมาเอาว่าเกิดจากเดเบียน แฮ่ แฮ่ กว่าจะค้นหาปัญหาได้ก็ผ่านไปเดือนกว่าๆ ถ้าเกิดอะไรขึ้นกะเซอร์เวอร์ที่ให้บริการจริง ป่านนี้คงเอาหน้าไปไว้ที่ไหนไม่ได้แล้วล่ะ คิดๆอยู่เหมือนกันว่าจะเอาปัญหาไปถามที่ LTN ไหนก็เล่าแล้ว เล่าให้ฟังเลยดีกว่าว่า ตอนที่ไปงาน TMI 2005 ปีนี้คณะแพทยศาสตร์ มหาวิทยาลัยเชียงใหม่รับเป็นแม่งาน ก็ได้เจอกับ คุณ ott (ภัทระ เกียรติเสวี) ด้วย ขออนุญาตพาดพิงถึงหน่อย ในฐานะที่ติดตามงานของแกมานานตั้งแต่ทำ Linux-SIS แล้ว วันนั้นก็เข้าไปนั่งฟังคุณ ott คุยเรื่องเกี่ยวกับ Linux และการนำไปใช้งาน หลังจากจบ session แล้วผมก็ได้มีโอกาสได้พูดคุยแล้วก็เล่าให้ฟังถึงปัญหาที่ผมเจอเข้าจริง คุณ ott ก็อุตสาห์ถามย้ำแล้วนะ ว่าเซต locale แล้วหรือยัง ไอ้เราก็ยังไม่ค่อยเข้าใจ (บ้านน๊อก บ้านนอก) กลับมาก็พยายามมาค้นดู ก็เลยเจอคำตอบจังเบ้อเร่อ ก็คุยกันนานพอสมควร ทราบว่าตอนนี้กลับมาอยู่เมืองไทยแล้ว ทำธุรกิจเปิดบริษัท metamedia ร่วมกับ คุณพูลลาภ ก็ขออำนวยอวยพรให้กิจการก้าวหน้าด้วยดีนะครับ วันหน้าผมอาจจะมีโอกาสไปเป็นลูกค้า้บ้างก็ได้ถ้าปีหน้า defend งบได้มากๆ สรุปแล้วก็ Happy ที่ได้ผ่านเหตุการณ์อันไม่คาดฝันแล้วพยายามแก้ปํญหาไปได้ถึงแม้ว่า จะช้าไปมาก ปัญหามา ปัญญาก็มี ความรู้ก็ได้มากขึ้น กำไรเห็นๆ


พูดถึง TMI 2005 นิดนึงว่าปีนี้ค่อนข้างเงียบเหงาไปหน่อย อาจจะเป็นเพราะว่า ขาใหญ่ คือ Intel ไม่ได้เป็น titanium sponsor กลายเป็น Sun Microsystem ไปซะ บูตก็เลยน้อย พริตตี้ก็เลยพลอยน้อยไปด้วย (สาเหตุใหญ่ที่ชอบไปงานคอม เหอ เหอ)



คราวก่อนที่อ่าน
ก็สงสัยเหมือนกันว่า เกิดจากอะไร
วันนี้คุณอุทัย เฉลยให้ฟังแล้ว

ขอบคุณครับ  


ครับ กว่าจะมาเฉลยได้ เสียวอยู่ตั้งนาน 555  


แสดงความคิดเห็น
Powered for by Blogger Templates free hit counter code
Copyright ? 2008-2009 Uthai Lueadnakrop. All Rights reserved