ผู้เขียน หัวข้อ: เจอปัญหากับภาษาไทยเป็นเครื่องหมายคำถาม ??  (อ่าน 27675 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

ออฟไลน์ มนตรี บอยรักยุ้ยคนเดียว

  • Hero Member
  • *****
  • กระทู้: 5,369
  • Respect: +12
    • ดูรายละเอียด
    • โรงพยาบาลชุมชน ด่านมะขามเตี้ย
รับรองว่าหลายๆคนต้องเคยเจอปัญหากับภาษาไทยเป็นเครื่องหมายคำถาม ??
ซึ่งสาเหตุมีเพียงเรื่องเดียวคือเรื่องของ charset ของ database
แต่เอ๊ะ ทำไมแก้ยังไงก็ไม่ได้ซะที ทั้งๆที่โฮสเก่าก็ใช้ได้ แต่โฮสใหม่ก็ทำเหมือนๆกันแต่ใช้ไม่ได้
มาดูกันครับว่าอะไรเป็นอะไร

เริ่มต้นตั้งแต่การติดตั้ง mysql
ใน การติดตั้ง mysql-server นั้นหากไม่มีการระบุ charset ใดๆ ก็จะมี default charset เป็น latin1_swedish_ci หากมีการระบุตอน compile ก็จะเป็น charset ตามที่ระบุไว้
อย่างไรก็ดีค่า default-charset สามารถเปลี่ยนแปลงภายหลังได้โดยการระบุไว้ในไฟล์ my.cnf
เมื่อ เราทำการสร้าง database ใหม่ database ก็จะมี charset ตามค่า default ในไฟล์ my.cnf หรือถ้าใน my.cnf ไม่มีการระบุก็จะเป็นค่า default ตอน compile

compile php with mysql
ในการ compile php นั้นเราจะต้อง configure --with-mysql=path เมื่อ compile เสร็จแล้ว สิ่งที่ได้รับคือ php จะทำการ connect mysql ด้วย charset ตามค่า default charset ของ mysql lib ซึ่งจะไม่สามารถเปลี่ยนได้ด้วย my.cnf หรือ php.ini

การตั้งค่าและการใช้งาน
แบบที่ 1
-- compile mysql เป็น default charset latin1
-- ไม่มีการกำหนด default charset ใน my.cnf
-- สร้าง database ใหม่ก็จะได้ charset เป็น latin1
-- เวลาใช้งาน php ก็ connect ด้วย charset latin1 ตาม mysql lib
-- ผลลัพธ์คือ การเก็บข้อมูลแบบ ascii ในตารางแบบ ascii
-- การใช้งานหน้าเว็บ ปกติ (encoding tis-620 หรือ windows-874)
-- phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็นภาษาไทย
-- phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ascii encoding iso-8559-1

แบบที่ 2
-- compile mysql เป็น default charset latin1
-- แล้วกำหนด default charset ใน my.cnf เป็น utf8
-- สร้าง database ใหม่ก็จะได้ charset เป็น utf8 ตาม my.cnf
-- แต่เวลาใช้งาน php ดัน connect ด้วย charset latin1 ตาม mysql lib
-- ผลลัพธ์คือ การเก็บข้อมูลแบบ ascii ในตารางแบบ unicode
-- การใช้งานหน้าเว็บ ปกติ (encoding tis-620 หรือ windows-874)
-- phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็นภาษาไทย
-- phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ascii encoding iso-8559-1

แบบที่ 3
-- compile mysql เป็น default charset utf8
-- กำหนดหรือไม่กำหนด default charset ใน my.cnf เป็น utf8 ก็ได้
-- สร้าง database ใหม่ก็จะได้ charset เป็น utf8
-- เวลาใช้งาน php ก็ connect ด้วย charset utf8 ตาม mysql lib
-- ผลลัพธ์คือ การเก็บข้อมูลแบบ unicode ในตารางแบบ unicode
-- การใช้งานหน้าเว็บ ปกติ (encoding utf-8)
-- phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็น ??
-- phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ภาษาไทย

แบบที่ 4
-- compile mysql เป็น default charset utf8
-- กำหนดหรือไม่กำหนด default charset ใน my.cnf เป็น utf8 ก็ได้
-- สร้าง database ใหม่ก็จะได้ charset เป็น utf8
-- เวลาใช้งาน php ก็ connect ด้วย charset utf8 ตาม mysql lib
-- ผลลัพธ์คือ การเก็บข้อมูลแบบ unicode ในตารางแบบ unicode
-- การใช้งานหน้าเว็บไปใช้กับระบบที่เป็น encoding tis-620
-- phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็น ??
-- phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ภาษาไทย
หมาย เหตุ: แก้ encoding หน้าเว็บเป็น utf-8 ก็จะใช้งานได้ปกติ แต่จริงๆคือการเอา script แบบ ascii มาใช้ในระบบ unicode ผลที่จะตามมาคือขนาดของ field ในแต่ละตารางจะกำหนดไว้สั้นเกินไปเนื่องจาก utf-8 ใช้เนื้่อที่มากกว่าแบบ ascii 3 เท่า

แบบที่ 5
-- compile mysql เป็น default charset latin1
-- แล้วกำหนด default charset ใน my.cnf เป็น utf8
-- รวมถึงกำหนด init ใน my.cnf เป็น utf8 ด้วย
Code:

init-connect='SET collation_connection = utf8_general_ci'
init-connect='SET NAMES utf8'

-- สร้าง database ใหม่ก็จะได้ charset เป็น utf8 ตาม my.cnf
-- และเวลาใช้งาน php จะ connect ด้วย utf8 ตาม init-connect ใน my.cnf
-- ผลลัพธ์คือ การเก็บข้อมูลแบบ unicode ในตารางแบบ unicode
-- การใช้งานหน้าเว็บ ปกติ (encoding utf-8)
-- phpmyadmin เวอร์ชั่น 2.5 แสดงผลเป็น ??
-- phpmyadmin เวอร์ชั่น >2.7 แสดงผลเป็น ภาษาไทย

ขอแสดงตัวอย่างแค่ 5 แบบที่น่าจะพบมากที่สุดพอครับ

ผลกระทบ
ใน แต่ละแบบจะเห็นว่าระบบจะบังคับการใช้งานไปใน charset ใด charset หนึ่ง ซึ่งหากต้องการใช้งานระบบที่ต่างจาก default charset  ที่ตั้งค่าไว้ จะต้องกำหนดใน code php หลังจากทำการ connect และ select database แล้ว ดังนี้
Code:

mysql_query("SET NAMES 'charset_name' COLLATE 'collation_name';");
เช่น
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci';");
หรือ
mysql_query("SET NAMES 'tis620' COLLATE 'tis620_thai_ci';");
หรือ
mysql_query("SET NAMES 'latin1' COLLATE 'latin1_swedish_ci';");


การแก้ปัญหา
สำหรับ ระบบที่ติดตั้งใหม่ ไม่น่าจะมีปัญหามากนัก หากติดตั้งแล้วไม่แสดงผลอย่างที่ควรเป็น ก็ให้ตรวจสอบ collation ของ Database ที่สร้างใหม่ให้ตรงกับที่ต้องการก่อนที่จะทำการติดตั้ง script และก็ให้ทำการเพิ่มคำสั่ง
Code:

mysql_query("SET NAMES 'charset_name' COLLATE 'collation_name';");

เข้าไปก็น่าจะหมดปัญหา

สำหรับ ระบบที่ใช้งานอยู่แล้วไม่มีปัญหาแต่มีปัญหาตอนย้ายโฮส ก็คงต้องหาข้อแตกต่างระหว่าง 2 server ออกมา โดยไล่ดูการตั้งค่าต่างๆของทั้ง 2 server ดังนี้
-- default charset ของ mysql lib
-- default charset ใน my.cnf
-- มีการกำหนด init connect ใน my.cnf หรือไม่
-- php connect ด้วย default charset อะไร
-- Database ที่สร้างไว้มี collation อะไร
-- Table ต่างๆใน database มี charset อะไร สอดคล้องกับ collation หรือไม่
-- ข้อมูลที่เก็บอยู่ใน table เก็บลักษณะใหน charset อะไร แสดงผลถูกต้องหรือไม่ (ทั้ง phpmyadmin และ หน้าเว็บ)
-- หน้าเว็บแสดงผลด้วย encoding อะไร
-- ข้อมูลที่ export ออกมาเป็น .sql export ด้วยวิธีใหน mysqldump, phpmyadmin เวอร์ชั่นอะไร, bigdump, ...
-- ไฟล์ .sql เปิดอ่านด้วย text editor อ่านออกหรือไม่ (แนะนำให้ใช้ notepad++ แล้วลองเปลี่ยน Format / Encoding ดูด้วย)


อ่านเรื่อง charset เพิ่มเติมได้ที่ http://www.thaihosttalk.com/th1/index.php?topic=6764.msg63194#msg63194
บทความที่เกี่ยวข้อง http://www.itwizard.info/technology/MySQL/MySQL_with_thai.html
« แก้ไขครั้งสุดท้าย: ธันวาคม 27, 2008, 20:52:57 PM โดย บอย(ด่านมะขามเตี้ย) »
เริ่ม11พย.2548OPD-Paperlessพร้อมHOSxPลดโลกร้อน
FF-Paperless(รพ.สค.)เริ่ม1ตค2555=100%
IPD-Lesspaper1ตค2560ระบบDmsByNeoNetwork
IPD-Paperless1พ.ค2562ระบบHOSxPXE4
ServerMTOL8.5+MDB-10.4.20,SlaveOL8.5+MDB-10.7.3
LOG=PostgreSQL11,INV=PostgreSQL11

ออฟไลน์ มนตรี บอยรักยุ้ยคนเดียว

  • Hero Member
  • *****
  • กระทู้: 5,369
  • Respect: +12
    • ดูรายละเอียด
    • โรงพยาบาลชุมชน ด่านมะขามเตี้ย
Mysql กับภาษาไทย
« ตอบกลับ #1 เมื่อ: ธันวาคม 27, 2008, 20:54:06 PM »
0
 Mysql กับภาษาไทย   
เริ่มต้นกับ UTF-8 พร้อมโปรแกรมแปลง TIS-620 เป็น UTF-8
UTF-8  คือ character ที่สามารถรองรับการทำงานระบบหลายภาษา (Multi language)
   ระบบ UTF-8 จะเก็บข้อมูล 1 - 4 ไบต์ต่อ 1 ตัวอักษร รายละเอียดอื่นๆ แนะนำ
http://en.wikipedia.org/wiki/UTF-8 ชัดเจนกว่าครับ
สำหรับคนไทยถึงเวลาแล้วหรือยังที่จะเปลี่ยนจาก TIS-620 เป็น UTF-8 ?
   ในเรื่องนี้ก็คงต้องแล้วแต่ความคิดส่วนตัวของแต่ละบุคคลครับ ว่าสามารถยอมรับระบบใหม่ได้ไหม
แต่ในปัจจุบันสำหรับครับคิดผมก็คือ ถึงเวลาแล้วสำหรับ UTF-8 การที่เราจะรออนาคตให้มีการเปลี่ยนแปลง
แล้วเราจะเปลี่ยนตาม ตัวเราเองน่าจะเป็นผู้กำหนดอนาคตเอง มากกว่าให้คนอื่นมากำหนดอนาคตให้กับเรา
   ในอดีตภาษาไทยที่มาก่อนรหัส TIS-620 (รหัสสมอ.) นั่นก็คือรหัสเกษตร สำหรับใครที่ใช้ DOS สมัยก่อน
คงจะรู้จักกันดี ในอดีตเราก็ยังเปลี่ยนแปลงจากรหัสเกษตรเป็น TIS-620 ได้ การที่เราจะเปลี่ยนแปลง
ปัจจุบัน UTF-8 ใกล้ชิดกับตัวเรามากที่สุด โดยที่เราไม่รู้ตัว ยกตัวอย่างเช่น ชื่อไฟล์ภาษาไทยที่อยู่บน
Windows XP นั้นก็เป็น UTF-8 อยู่แล้ว แต่เรายังไม่รู้ตัว, Google ก็ทำงานแบบ UTF-8 โดยที่เราไม่รู้ตัว
บางคนที่ใช้ Gmail อาจโทษว่า "Gmail ไม่รองรับภาษาไทย ส่งให้คนอื่นอ่านแล้วอ่านไม่ออก" ตรงนี้บอกได้เลยครับว่า
ไม่ต้องโทษ Gmail หรอกครับ ต้องโทษระบบอีเมล์ที่ไม่ยอมทำความรู้จักกับ UTF-8 น่าจะถูกต้องกว่า
อุปกรณ์ต่างๆ ไม่ว่าจะเป็นมือถือที่เป็น OS Symbian, Pocket PC เค้าก็ใช้ UTF-8 กันแทบทั้งสิ้น
ตอนนี้มีเพียงคำถามเดียวครับว่า เรายังจะยึดติดอยู่ที่ TIS-620 ไปตลอดหรือ ?
หากใครยังชั่งใจอยู่ในเวลานี้ ก็ศึกษาข้อมูลเพิ่มเติมได้ก่อนที่จะเปลี่ยนแปลงจริงๆ จังๆ อีกที
เริ่มต้นกับ UTF-8
   มีคำถามมากมายเกี่ยวกับ UTF-8 ผมขอแยกเป็นข้อๆ ในส่วนของข้อดีและข้อเสีย
แล้วลองพิจารณาดูนะครับว่า ขณะนี้เราพร้อมแล้วหรือยังกับ UTF-8
ข้อดีของ UTF-8 กับ TIS-620
      - รองรับได้หลายภาษา แน่นอนที่สุดสำหรับผมเลือกใช้เพราะสาเหตุนี้
      - ภาษาโปรแกรมมิ่งทั้งหลายรองรับ UTF-8
      - เข้ากันได้ดีกับรหัส ASCII
      - การแปลงเป็น Charset ชนิดอื่นไม่ยุ่งยากโดยใช้ ICONV
      - สามารถเรียงลำดับอักษรภาษาไทยได้ 100% ไม่มีผิดเพี้ยน

ข้อเสียของ UTF-8 กับ TIS-620
      - มีปัญหาการทำงานกับฟังก์ชั่นในบางภาษา
      - ภาษาไทยไม่ได้มีเพียงแค่ TIS-620 (มีทั้ง CP874, MacThai)
        อ้างอิงจาก http://www.gnu.org/software/libiconv/
      - เสียเวลาในการเขียนโปรแกรมแปลงฐานข้อมูล และไฟล์ให้เป็น UTF-8
      - การออกแบบฐานข้อมูล (Field) ต้องไม่ยึดติดกับความกว้างตัวอักษรแบบเดิม เพราะ UTF-8 จะเก็บเป็น Byte
        สรุปคือต้องขยายความกว้าง Field เกือบทุก Field ที่เป็น Varchar เพื่อรองรับ UTF-8

ปัญหาสำหรับนักพัฒนาภาษา PHP กับ UTF-8
   การปรับมาใช้ UTF-8 นั้นก็เป็นปัญหาสำหรับโปรแกรมเมอร์เหมือนกัน โดยตัวอย่างที่ผมจะอธิบายต่อไปนี้
ก็ขออ้างอิงถึงภาษา PHP ครับ เพราะปัจจุบันผมก็เขียนโปรแกรมกับภาษานี้อยู่ ซึ่งปัญหาหลักๆ เกิดจาก
การเขียนโปรแกรมแล้วเลือกใช้บางฟังก์ชันไม่ได้ หรือต้องปรับแก้โปรแกรมหรือใช้ฟังก์ชันที่รองรับ UTF-8

ฟังก์ชันที่มีปัญหากับ UTF-8 ในภาษา PHP อ่านรายละเอียดเพิ่มเติมได้ที่ http://www.phpwact.org/php/i18n/utf-8
โดยแต่ละฟังก์ชันจะมีการแจกแจงผลกระทบตั้งแต่ระดับ สูง - กลาง - ต่ำ ละเอียดดีครับ

พร้อมแล้วหรือยังที่จะแปลงระบบโปรแกรมและฐานข้อมูลเป็น UTF-8 ?
   ข้อนี้ต้องถามตัวเองแล้วครับว่าพร้อมแล้วหรือยัง ส่วนผมพร้อมแล้วและก็ทำไปแล้ว
ท่องไว้ครับคำนี้นะ "อย่ายึดติดกับระบบเดิมๆ" ปัญหาต่างๆ เหล่านี้สามารถแก้ไขได้ครับ
เพราะว่าบางฟังก์ชันเราก็เขียนขึ้นมาใหม่ แทนที่ฟังก์ชันเดิมที่ไม่รองรับ UTF-8
ว่าแล้วก็แจกโปรแกรมแปลงเลยครับ โดยในโปรแกรมจะมีตัวอย่างฟังก์ชัน substr_utf8 ที่เขียนขึ้น
โดยสามารถรองรับ UTF-8 แทนฟังก์ชัน substr เดิมที่มีอยู่

โปรแกรมแปลงระบบเป็น UTF-8
    1. โปรแกรมแปลงฐานข้อมูล MySQL จาก TIS-620, CP874, MacThai เป็น UTF-8
    2. โปรแกรมแปลงไฟล์ จาก TIS-620,CP874,MacThai เป็น UTF-8

ดาวน์โหลดได้จาก : http://prdownloads.sourceforge.net/appserv/appserv-Tis2utf8-1.0.zip?download

** หมายเหตุ **
    โปรแกรมที่แจกไม่ใช่ Freeware ไม่ใช่ Shareware แต่เป็น Open Source นะครับ
สงวนลิขสิทธิ์ในรูปแบบ GPL สรุปคือเอาไปใช้กันได้เลยครับไม่ต้องคิดมาก
และที่สำคัญโปรแกรมอาจจะมี Bug บ้าง ใครแก้ Bug แล้วกรุณาส่งกลับมาด้วยครับ
เผื่อจะได้แจกจ่ายให้กับคนอื่นๆ อีกต่อไปครับ ตอนแก้ใส่ Credit มาด้วยนะครับว่าแก้ตรงไหน
โปรแกรมนี้ สามารถแปลงจาก Charset ไหนๆ ก็ได้ในโลก ไปเป็น Charset ไหนๆ ก็ได้อีก
ทำได้โดยแก้ไข Source Code กันเอาเองนะครับ ถ้าอยากแปลงเป็นอย่างอื่น
วิธีการใช้งานต่างๆ มีอยู่ในไฟล์โปรแกรมแล้วครับลองเปิดดู

ข้อมูลอ้างอิง TIS-620
- http://www.nectec.or.th/it-standards/std620/std620.htm
- http://software.thai.net/tis-620/index.html
- http://linux.thai.net/~ott/docs/tis-620.html
- http://en.wikipedia.org/wiki/TIS-620

หลายๆ คนมีความเข้าใจว่า MySQL ตั้งแต่รุ่น 5.0.x เป็นต้นไป มีปัญหาในการใช้ภาษาไทย ผมทดลองหาวิธีแก้ไขปัญหาไว้เล็กน้อยครับตอนที่จะ upgrade Server ในภาควิชา ก็มีความกังวลกันว่า ต้องเปลี่ยนไปใช้ MySQL Server รุ่นใหม่ๆ ที่หลายๆ คนลือกันว่า มีปัญหาเรื่องภาษาไทย และ database เดิมที่มักจะเขียนด้วย tis-620 (หรือที่หลายคนอาจจะเข้าใจว่า เป็น latin) ซึ่งเป็นรหัสภาษาไทย(character set) ชนิด 8 บิท

มีการสอบถามผู้ที่ คาดว่า จะรู้ หรือผู้ที่ดูแลระบบไอที ก็ไม่ค่อยได้รับคำตอบว่า จะแก้ไขปัญหาอย่างไร ส่วนใหญ่ก็แนะนำไปว่า ก็ใช้ MySQL Server รุ่นเดิมไปก่อน

ลองค้นหาใน website ก็พบว่า มีคนเขียนไว้เหมือนกัน แต่อ่านแล้วอ่านอีกก็ไม่เข้าใจถ่องแท้สักทีครับ ลองอ่านดูที่คุณ ต้มยำกุ้ง นำมาให้อ่านดูก็ได้ครับ นั่นก็เป็นตัวอย่างหนึ่งครับ สำหรับผู้ผู้ที่รู้เรื่องเกี่ยวกับ character set และ encoding แล้วก็อาจจะเข้าใจได้ไม่ยาก แต่คนที่ไม่มีพื้นฐานเกี่ยวกับสิ่งเหล่านี้เลย อ่านหลายๆ รอบก็ไม่เข้าใจครับ

ผมลองอ่านดูที่บางคนเขียนไว้ รวมทั้งสอบถามกูรูไอทีบางคนอธิบาย ก็ยังงงๆ เหมือนเดิม สุดท้ายต้องลงมือทำดู จึงได้เข้าใจขึ้นมาบ้าง

ต้องบอก ว่า ระหว่างที่ลองทำดูก็ยังมีความเข้าใจที่เป็นการเข้าใจผิดเหมือนกันครับ และที่ผมจะบันทึกไว้ต่อไปนี้ ก็อาจจะไม่ถูกต้องทั้งหมดก็ได้ครับ

ข้อเท็จจริงที่ผมพบ คือ

MySQL Server รุ่นไหนๆ ก็รองรับการใช้ภาษาไทย (รวมทั้งภาษาอื่นๆ ด้วย) โดยเฉพาะรุ่นที่รองรับ character set utf-8 จะมีข้อดีมากๆ คือ สามารถใช้ได้หลายภาษา
ควรเลือกใช้ phpMyAdmin รุ่นประมาณ 2.6.x-2.7.x (ผมไม่แน่ใจว่า รุ่น 2.8-2.9 เป็นอย่างไร แต่รุ่น 2.10-2.11 ควรหลีกเลี่ยงสักพักก่อน)
โดย default แล้ว MySQL Server จะตั้งค่า character set ไว้ค่อนข้างพิลึก หากดูจาก phpMyAdmin ให้คลิกที่ Show MySQL system variables จะพบส่วนที่เกี่ยวกับ cahracter set และ collation (สำหรับการเรียงลำดับ) หลายตัวครับ บางตัวก็เป็น utf8 บางตัวก็เป็น latin1 ส่วนที่เป็นปัญหา คือ ส่วนที่ระบุเป็น latin1 เพราะเป็น character set ที่รองรับรหัสภาษาเพียง 8 บิทเท่านั้น
การแก้ปัญหาก็เลยต้องปรับทุกตัวให้เป็น utf8 เสีย โดยการแก้ไขไฟล์ /etc/mysql/my.cnf ด้วยการเพิ่ม
    default-character-set=utf8
เข้า ไปที section ของ [client] และ [mysqld] จากนั้น ก็ restart ด้วยคำสั่ง sudo /etc/init.d/mysql restart (สำหรับ Ubuntu หรือ Debian) จากนั้น system variables อีกครั้ง จะพบว่า character set เป็น utf8 ทั้งหมด
วิธี การ port ข้อมูลเดิมไปใส่ในฐานข้อมูลบน MySQL Server ตัวใหม่ต้องมีความเข้าใจว่า เดิมฐานข้อมูลใช้ character set ใด และต้องการ port ไปใน Server ตัวใหม่ให้เป็น character set ใด หากเดิมเป็น tis620 และต้องการให้เป็น tis620 เหมือนเดิม ให้ตั้งค่าในข้อ 4 เป็น default-character-set=tis620 แทนที่จะเป็น utf8 ครับ แล้วก็ port ข้อมูลที่ dump ไว้เข้าไป ก็จะไม่มีปัญหาครับ
แต่หากเดิมเป็น tis620 และต้องการแปลงเป็น utf8 ในฐานข้อมูลใหม่ วิธีที่ผมใช้ก็คือ

ตั้งค่าในข้อ 4 เป็น default-character-set=utf8
แปลง character set ในฐานข้อมูลจาก tis620 เป็น utf8 ด้วยคำสั่ง
    iconv -f tis620 -t utf8 source_file >dest_file
จากนั้น ก็ import เข้าฐานข้อมูลใหม่ ก็ใช้ได้เลยครับ
       อีกวิธีที่ไม่ต้องไปยุ่งกับการตั้งค่าใน my.cnf และการมาแปลง character set ในไฟล์เอง ก็คือ บอก mysql client ให้ทราบว่า ไฟล์ต้นทางเป็น character set แบบใด เช่น

สมมติว่า ไฟล์ฐานข้อมูลที่ dump มาชื่อ mydb.sql มี character set เป็น tis620 และเราต้องการ import เข้าไปใน MySQL Server ให้เป็น utf8 เราก็สามารถใช้คำสั่ง mysql ดังนี้
mysql --default-character-set=tis620 mydb <mydb.sqlคำสั่งข้างต้นนี้ได้ละ options บางส่วนไว้ ขึ้นกับการตั้งค่าใน Server ของแต่ละคนครับ
เริ่ม11พย.2548OPD-Paperlessพร้อมHOSxPลดโลกร้อน
FF-Paperless(รพ.สค.)เริ่ม1ตค2555=100%
IPD-Lesspaper1ตค2560ระบบDmsByNeoNetwork
IPD-Paperless1พ.ค2562ระบบHOSxPXE4
ServerMTOL8.5+MDB-10.4.20,SlaveOL8.5+MDB-10.7.3
LOG=PostgreSQL11,INV=PostgreSQL11

ออฟไลน์ มนตรี บอยรักยุ้ยคนเดียว

  • Hero Member
  • *****
  • กระทู้: 5,369
  • Respect: +12
    • ดูรายละเอียด
    • โรงพยาบาลชุมชน ด่านมะขามเตี้ย
อย่าลืมตั้ง Character set เป็น tis-620
« ตอบกลับ #2 เมื่อ: ธันวาคม 27, 2008, 21:01:08 PM »
0
คัดมาจาก.....
http://linux.thai.net/ott/docs/tis-620.html' target='_blank'>http://linux.thai.net/ott/docs/tis-620.html
---------------------------------------------------------------------
สร้างเว็บให้ถูกหลัก อย่าลืมตั้ง Character set เป็น tis-620
1. ผมมีเวลาไม่มาก ขอแบบสรุปเลยได้ไหม ว่าท่านกำลังพูดถึงอะไร
ใน การสร้างเว็บเพจ (HTML ไฟล์) ที่มีเนื้อหาเป็นภาษาไทย ควร ใส่ข้อความเพื่อบ่งบอกว่า เว็บเพจของท่านมีข้อความที่เป็นภาษาไทย เพื่อที่ Browser จะสามารถที่จะเข้าใจ และแสดงผลภาษาไทยได้ถูกต้อง อีกทั้งยังเป็นประโยชน์ในการค้นหาข้อมูลของ search engine ต่างๆ ที่จะรับทราบว่าเนื้อหาในเว็บเพจของท่านเป็นภาษาไทย
วิธีการทำได้โดยง่าย โดยเพียงเพิ่มบรรทัดดังตัวอย่างในส่วนหัวของ HTML ไฟล์ของท่าน
2. character-set คืออะไร ทำไมต้องมี character set
คอมพิวเตอร์เก็บข้อมูลโดยรหัสดิจิตอล 0 กับ 1
รหัส 1 ตัว เรียกว่าเป็น 1 bit, รหัส 8 bit เรียกว่าเป็น 1 byte
พยัญชนะ ภาษาอังกฤษ มี 26 ตัว คิดแยกเป็นตัวใหญ่ตัวเล็ก รวมตัวเลขและอักษรพิเศษต่างๆ แล้ว ก็ยังมีจำนวนไม่มาก (ไม่มากคือประมาณ 100 ตัว)
ผู้ที่คิดค้นคอมพิวเตอร์ในยุคแรกๆ นั้นเป็นผู้ที่ใช้ภาษาอังกฤษ ดังน้นจึงคิดค้น ระบบการเก็บข้อมูลโดยใช้รหัสยาว 7 บิต (ASCII) สามารถเก็บอักขระต่างๆ ได้ แตกต่างกันทั้งหมด 2^7 ตัว = 128 ตัว นับว่าเพียงพอสำหรับการใช้งานทั่วไป เช่น ตัวอักษร A จะตรงกับรหัส ASCII 65 เขียนเป็นเลขฐาน 2 เรียงกัน 7 ตัวได้ดังนี้ 100 0001
ต่อมาคอมพิวเตอร์ได้แพร่หลายไปยังประเทศที่ไม่ ได้ใช้แค่ภาษาอังกฤษ ได้มีวิธีการแก้ไขแบบเฉพาะหน้า โดยการเพิ่มความยาวของรหัสที่เก็บจาก 7 ตัว ให้เป็น 8 ตัว ก็จะสามารถเก็บอักษรได้ทั้งหมดเป็น 2^8 = 256 ตัว
ประเทศต่างๆ ก็สามารถใช้ส่วนที่เกินมาอีก 128 ตัวนั้น ใช้เก็บรหัสอักขระเพิ่มเติม ที่เป็นเฉพาะของภาษาตนเอง เช่น กลุ่มประเทศยุโรปแถบตะวันตก ก็จะใช้เก็บอักขระเช่น พวก ที่มีลักษณะคล้าย a, e, i แต่มันจุดหรือมีขีดอยู่บนตัวอักษรเหล่านั้น (ซึ่งใช้กันในภาษาของพวกเขา) ตัวอย่างเช่น รหัส 228 จะเป็นตัว a umlaut คือ a แล้วมีจุดอยู่ข้างบน 2 จุด ใช้กันในภาษาเยอรมันเป็นต้น
ประเทศไทยก็ได้ใช้ประโยชน์ของรหัส 128 ตัวที่เกินมานี้เช่นกัน เช่น เราเก็บรหัส ก ไก่ ไว้ที่หมายเลข 161, เราเก็บไม้มลาย "ไ" ไว้ที่รหัสหมายเลข 228 เป็นต้น
ดังที่กล่าวมาแล้ว นั้น เราจำเป็นต้องมีตารางที่จะแสดงว่า หมายเลขอะไร หมายถึงตัวอักษรอะไร ตารางนี้ ก็จะแตกต่างกันไปในแต่ละภาษา ซึ่งมีอักขระซึ่งต่างๆ กัน
ดูๆ ไปแล้ว ก็ยังไม่เห็นว่าจะมีปัญหาอะไร ตราบใดที่ในเครื่องคอมพิวเตอร์ของท่าน มีใช้งาน แค่ 2 ภาษา เช่น ภาษาไทย กับ ภาษาอังกฤษ ถ้าท่านได้รับรหัสมามีค่า 228 ก็สรุปได้เลยว่าผู้ส่งต้องการจะส่งไม้มลาย มา
แต่หากท่านต้องการจะส่ง ข้อมูล ไปยังเครื่องคอมพิวเตอร์เครื่องอื่น หรือเปิด Web Site ให้ผู้คนจากทั่วโลกเข้ามาดู ที่ไม่ได้ใช้ภาษาไทย อยู่ด้วย ผู้คนเหล่านั้น จะเข้าใจได้อย่างไรว่า ท่านต้องการส่ง ไม้มลาย ซึ่งเป็นอักขระหนึ่งของภาษาไทย?
ถ้าคนเยอรมันได้รับรหัสนั้น ย่อมต้องแปลความหมายของรหัส 228 ที่ท่าน ส่งไปว่าเป็นอักขระ a umlaut ที่พวกเขาใช้กัน? เขาควรจะรู้ได้อย่างไรว่า เขาควรจะหยิบตารางที่ใช้แปลงค่ารหัสเป็นภาษาไทย แทนที่จะใช้ตารางของภาษาเยอรมัน?
วิธีแก้ปัญหานั้นก็ง่ายดาย เพียงแต่ระบุแปะหน้าไปว่าข้อมูลของท่านนั้น ขอให้ใช้ตารางสำหรับภาษาไทยในการถอดรหัส
สิ่งที่ระบุแปะหน้าไปนั้น ก็เป็นที่เรียกกันว่า character set
วิธี แก้ปัญหาโดยการแปะหน้าด้วย character set ังกล่าวได้กลาย เป็นวิธีที่เป็นมาตรฐานแล้ว โดยระบบที่สนับสนุนการใช้หลายรหัสอักขระต้องมีวิธีระบุcharacter set อย่างใดอย่างหนึ่ง เพื่อแยกความแตกต่าง เช่น การระบุที่ส่วนหัวของเอกสารสำหรับ HTML (ดังที่จะแนะนำต่อไป) นอกจากนี้ยังสามารถใช้ escape sequenceเพื่อสลับภาษา (เช่น ใน Emacs ซึ่งใช้ISO/IEC 2022) หรือใช้Unicode (ซึ่งใช้ได้ในHTMLเช่นกัน แต่อยู่นอกเหนือขอบเขตของบทความนี้)
3. แล้ว character set ของภาษาไทยมีหรือไม่? ถ้ามีมีชื่อว่าอะไร
มี และมีชื่อว่า tis-620, tis-620 เป็นที่ยอมรับกันในมาตรฐานสากล
[คัดลอกจาก http://software.thai.net/tis-620/index.html' target='_blank'>http://software.thai.net/tis-620/index.html ประเทศไทยมีมาตรฐานอักขระซึ่งกำหนดโดย สำนักงานมาตรฐานอุตสาหกรรม ดังที่เรียกกันโดยทั่วไปว่ารหัส สมอ. แต่รหัส สมอ. หรือที่มีชื่อทางการว่า มอก.620 หรือ TIS-620 นี้ เป็นมาตรฐานของประเทศไทย ซึ่งเมื่อนำไปใช้บนเครือข่ายอินเทอร์เน็ต ก็อาจเกิดความเข้าใจไม่ตรงกันได้ ดังนั้นจึงมีความพยายามที่จะจดทะเบียน รหัส สมอ. ที่ Internet Assigned Numbers Authority (IANA) ซึ่งเป็นผู้ควบคุมมาตรฐานของเครือข่ายอินเทอร์เน็ต และได้ดำเนินการจดทะเบียนจนสำเร็จ เมื่อวันที่ 22 กันยายน 2541
4. แล้ว character set ของภาษาอื่นๆ มีเช่นอะไรบ้าง
ภาษาของประเทศแถบยุโรปตะวันตก iso-8859-1
ภาษาของประเทศแถบยุโรปกลาง iso-8859-2
ภาษาญี่ปุ่น ใช้ euc_JP, iso-2022-jp และ Shift_JIS
5. พอเข้าใจแล้ว ทีนี้ ถ้าจะแปะหน้าข้อมูลของข้าพเจ้าให้ชาวโลกรู้ว่าเป็นภาษาไทย ต้องทำอย่างไร
ถ้าเป็น Web Site (HTML file) สามารถทำได้โดยง่ายโดยเพียงเพิ่มบรรทัด

เข้าไปยังส่วนหัวของ HTML ไฟล์ของท่าน เพียงเท่านี้ก็เป็นอันเสร็จสิ้น
ใน จดหมายอิเล็กทรอนิกส์ ติดตั้งให้โปรแกรมรับส่งจดหมายอิเล็กทรอนิกส์ของท่าน ให้ระบุในจดหมายว่า ข้อความของท่านถูกเข้ารหัสด้วย character-set tis-620 (วิธีการแตกต่างกันไปตามแต่ละ E-mail program)
6. ปัจจุบันนี้ ข้าพเจ้าไม่เห็นจะต้อง set อะไร ชาวบ้านชาวช่องก็สามารถจะดู Web Site ของข้าพเจ้าได้ ถ้าตั้ง character set ดังที่ว่าแล้วจะได้ประโยชน์อะไรขึ้นมา
วิธีการระบุ character set เป็นวิธีที่ถูกต้องทั้งทางหลักการและทางปฏิบัติ Browser ที่เป็นที่นิยมใช้ในปัจจุบัน สามารถจะรับรู้ character-set ที่ท่านตั้งไว้ และเลือกแสดงเป็นภาษาไทยได้อย่างถูกต้องโดยที่ไม่ต้องติดตั้งค่าอะไรเพิ่่ม เติม
Search engine ที่มาค้นข้อมูลในเพจของท่าน สามารถจะแยกแยะได้ทันทีว่านี่คือภาษาไทย ไม้มลายในเพจของท่านจะมีความหมายไม้มลาย Search engine จะไม่คิดว่ามันเป็น a umlaut อย่างแน่นอน
7. Browser อะไรบ้างที่รู้จัก tis-620
Browser ที่ทันสมัยทุกเวอร์ชั่นรู้จัก tis-620
Internet Explorer เวอร์ชั่น 5.5 ขึ้นไป
Netscape Communicator Version 6 ขึ้นไป
Mozilla
Konqueror (KDE)
Netscape Version 4 หรือตำ่กว่า ไม่สนับสนุน tis-620?
การ ที่ Browser ไม่สนับสนุนไม่ได้หมายความว่า การใส่ character set เป็น tis-620 จะไม่มีประโยชน์ เพียงแต่จะไม่มีผลกระทบใดๆ ท่านจำเป็นต้องใช้กลเม็ด เพิ่มเติมที่จะทำให้ผู้ใช้อ่านภาษาไทยได้ต่อไป แต่ถ้าภายหลังผู้ใช้ upgrade Browser เป็น เวอร์ชั่นใหม่เมื่อใด ก็สามารถใช้ประโยชน์จาก character set ที่ตั้งไว้ทันที
8. เว็บ ของผมใช้วิธีระบุ ... อยู่ ก็สามารถบังคับให้ Browser แสดงฟอนต์ไทยที่ต้องการได้ ก็ไม่เห็นจะมีปัญหาอะไร ทำไมต้องตั้ง character set ให้ยุ่งยาก
วิธี ระบุชนิดของฟอนต์ดังกล่าวนั้น เป็นการบอกว่า ในช่วงข้อความนี้ ถ้า Browser ของผู้เรียกดู Web ของท่าน มีฟอนต์ดังกล่าว ก็ขอให้ใช้ฟอนต์นั้นในการแสดงผล
แต่วิธีนี้ไม่ได้บอกแต่อย่างใดเลยว่าเอกสารของท่านเป็นเอกสารภาษาไ ทย
การระบุ เป็นสิ่งที่ทำได้ แต่ควรต้องควบคู่ไปกับการระบุ character set ด้วย
การที่ใช้ระบุแต่ โดยที่ไม่ได้ระบุ character set มีข้อเสียดังนี้
ถ้า เครื่องของผู้เรียกดู Web ของท่าน ไม่มีฟอนต์ดังกล่าว ก็จะนำฟอนต์อื่นๆ (ที่อาจจะไม่ใช่ฟอนต์ภาษาไทย) มาใช้ในการแสดงผล ทำให้ไม่สามารถอ่านภาษาไทยได้ตามต้องการ
เว็บเพจของท่านจะไม่มีความ หมายในทางข้อมูลว่าเป็นภาษาไทย ไม่สามารถนำไปประมวลผลในทางภาษาต่างๆ ได้ เนื่องจากผู้คนทั่วโลกจะไม่เข้าใจว่า มันเป็นภาษาไทย
ปัจจุบัน ในทุกระบบปฏิบัติการมีการใช้ฟอนต์แบบ Unicode (2 byte) กันอย่างแพร่หลาย ฟอนต์แบบ Unicode สามารถเก็บรหัสอักขระได้ถึง 2^16 = 65,536 ตัว เก็บได้เกือบทุกภาษาในโลก การใช้ฟอนต์ Unicode ในการแสดงผลนั้น จำเป็นอย่างยิ่งที่ จะต้องทราบว่า เอกสารนี้เป็นภาษาใด เพื่อจะ Browser จะได้เลือกส่วนภาษานั้นๆ จาก ฟอนต์ Unicode (ซึ่งมีหลายภาษามาก) ออกมาแสดงผล ถ้าท่านระบุ Font face เป็นฟอนต์แบบ Unicode แต่ว่าไม่ระบุภาษา แล้ว Browser จะรู้ได้อย่างไรว่า ควรจะหยิบส่วนภาษาไทย ของฟอนต์นั้นๆ ออกมาแสดง?
9. ผมใช้วิธีติดตั้ง character set เหมือนกัน แต่ว่าตั้งเป็น windows-874 ก็พบว่าใช้งานได้ดี Browser เรียกใช้ฟอนต์ภาษาไทยโดยอัตโนมัติ ทำไมต้องเปลี่ยนเป็น tis-620
ในทาง เทคนิคแล้ว windows-874 เป็น character set ที่เป็น superset ของ tis-620 (คำว่า super set หมายถึงว่า อะไรที่ tis-620 มี นั้น windows-874 มี) ดังนั้น เมื่อดูผลที่ออกมาจึงทำงานได้เหมือนกันทุกประการ
windows-874 เป็น character set ที่ใช้ภายในระบบปฏิบัติการที่ผลิตโดยบริษัท ไมโครซอฟต์ เท่านั้น ไม่ได้เป็น character set ที่ใช้ในการแลกเปลี่ยนข้อมูลระหว่างเครื่อง
tis-620 เป็น character set ที่จดทะเบียนถุกต้อง เป็นที่รับรู้กันทั่วโลก ทุกระบบปฏิบัติการ (แม้แต่ระบบปฏิบัติการของไมโครซอฟต์เอง)
windows-874 มีส่วนขยายเพื่อการแสดงผล เช่น bullet, smart quote, dash ฯลฯ ซึ่งไม่มีใน tis-620 และไม่มีในระบบปฏิบัติการอื่น ซึ่งจริงๆ แล้วไม่ได้เป็นเรื่องผิด ที่จะมีส่วนขยาย เพื่อที่จะใช้ภายในการทำงานของระบบปฏิบัติการเอง แต่ว่าเป็นเรื่องผิด ถ้านำไปใช้ใน การรับส่งข้อมูลระหว่างเครื่อง ระบบปฏิบัติการอื่นจะไม่เข้าใจรหัสเพิ่มเติมเหล่านี้ (และในทำนองเดียวกัน ในระบบปฏิบัติการอื่นๆ ก็จะมีส่วนขยายเพิ่มเติมภายใน ที่ ระบบปฏิบัติการของไมโครซอฟต์ไม่เข้าใจเช่นกัน)
การที่ตั้งเป็น windows-874 จะมีผลกับแค่ Browser ที่ทำงานอยู่บนระบบปฏิบัติการของไมโครซอฟต์เท่านั้น
การที่ตั้งเป็น tis-620 จะมีผลกับทุกระบบปฏิบัติการ? รวมทั้งระบบปฏิบัติการของไมโครซอฟต์ด้วย
10. ผมใช้วิธีติดตั้ง character set เหมือนกัน แต่ว่าตั้งเป็น x-user-defined ใช้ได้เหมือนกันไหม
ไม่ ได้ การใช้ character set นั้น มีขึ้นในยุคอดีต ที่เรายังไม่มี tis-620 ก็จึงใช้ x-user-defined ซึ่งทำให้ผู้ใช้ต้องตั้งที่ Browser ว่าควรจะใช้ฟอนต์ใดดีสำหรับ character set x-user-defined นี้ (ถ้าท่านเคยใช้ Netscape จนถึง Version 4 คงจำกันได้ดี ว่าท่านต้องติดตั้งค่าฟอนต์กันวุ่นวายก่อนที่จะเริ่มใช้งานภาษาไทยได้)
ปัจจุบัน นี้เรามี tis-620 แล้ว และ Netscape ก็มีถึงเวอร์ชั่น 6 แล้ว รวมถึง Mozilla ซึ่งจะเป็นอนาคตของ Netscape browser นอกจากนี้ Internet Explorer ก็ทำงานได้ดี เรียกได้ว่าเรามีทุกอย่างที่ทันสมัยและถูกต้องตามหลักการแล้ว ไฉนใยจึงย้อนกลับไปใช้วิธีแก้ขัดอย่างสมัยก่อนอีก เปรียบได้กับยามน้ำท่วมเราก็เอากระสอบทรายมากั้นน้ำชั่วคราว ไม่ให้น้ำเข้าบ้าน ซึ่งก็เป็นสิ่งที่ถูก แต่เวลานี้น้ำลด ก็ควรใช้วิธีการสร้างที่ถูกต้องตามหลักวิชา วิเคราะห์สาเหตุ ขุดลอกคูคลองให้ถูกต้องไป แทนที่จะมาต้องใช้กระสอบทรายกันอีก
11. ตัวอย่าง Web Site ที่ได้ทำการตั้ง Character set ให้เป็น tis-620 แล้วมีไหม จะทำการทดสอบได้อย่างไร
ท่าน สามารถทดลองใช้ Browser ต่างๆ ที่แสดงไว้ในคำถามข้อก่อนหน้านี้ ไม่ว่าจะทำการบนระบบปฏิบัติการใด (ที่มีฟอนต์ไทยติดตั้งอย่างถูกต้อง) ลองชี้ไปที่ Web site เหล่านี้ ผลที่ได้คือ Browser เหล่านั้น ควรจะแสดงภาษาไทยได้อย่างถูกต้อง โดยที่ไม่ต้องเลือกภาษา, encoding อะไรพิเศษแต่อย่างใด
http://www.ict.go.th' target='_blank'>http://www.ict.go.th
http://www.gits.or.th' target='_blank'>http://www.gits.or.th
http://www.pantip.com' target='_blank'>http://www.pantip.com
http://www.webmaster.or.th' target='_blank'>http://www.webmaster.or.th
http://www.mthai.com' target='_blank'>http://www.mthai.com
http://linux.thai.net' target='_blank'>http://linux.thai.net
รายละเอียดเพิ่มเติม
http://software.thai.net/tis-620/index.html' target='_blank'>http://software.thai.net/tis-620/index.html
http://www.nectec.or.th/it-standards/std620/std620.htm' target='_blank'>http://www.nectec.or.th/it-standards/std620/std620.htm
เริ่ม11พย.2548OPD-Paperlessพร้อมHOSxPลดโลกร้อน
FF-Paperless(รพ.สค.)เริ่ม1ตค2555=100%
IPD-Lesspaper1ตค2560ระบบDmsByNeoNetwork
IPD-Paperless1พ.ค2562ระบบHOSxPXE4
ServerMTOL8.5+MDB-10.4.20,SlaveOL8.5+MDB-10.7.3
LOG=PostgreSQL11,INV=PostgreSQL11