Tags:

เว็บผมทำเป็นแบบระบบเว็บบอร์ดนะครับ ช่วงที่ผมใช้โฮสต์เก่าอยู่ ข้อมูลทุกอย่างที่ใส่เข้าไปในกระทู้ ถ้าเป็นภาษาไทย เราก็จะอ่านออก แต่ถ้าดูใน database แล้วมันจะอ่านไม่ออกครับ (อย่างเช่น ʹ·¹Ò·ÑèÇä») แต่ว่าไม่มีปัญหาครับ เพราะถ้าในเว็บบอร์ดอ่านออก ผมก็ไม่เป็นไร

แต่พอผมจะเปลี่ยนโฮสต์ไปเป็นอีกที่นึง ผมได้ทำการ Export database ด้วย phpMyAdmin จากโฮสต์เก่า แล้ว Import เข้าไปที่โฮสต์ใหม่ แต่ผลปรากฎว่าภาษาไทยอ่านไม่ได้เลย มันจะขึ้นอะไรประมาณนี้น่ะครับ (???????????�??)

Export แล้วไป Import ดูง่ายๆไม่น่ามีปัญหาอะไร แล้วผมทำตรงไหนผิดเหรอครับ?

ผมลองดูไปดูมา ผมว่ามันเป็นตอนที่ Export ออกจากระบบมากกว่าน่ะครับ เพราะว่าตอนที่ผมบอกว่ามันใช้กับเว็บบอร์ดได้ แต่ดูใน database แล้วมันแปลกๆ ผมก็เลยคิดว่ามันเอาภาษาเพี้ยนๆที่ผมเห็นมาลงใน .sql ไฟล์ที่โหลดเข้ามา ทำให้ภาษาไทยกลายเป็นภาษาต่างดาวแทน แล้วพอ Import ไปที่โฮสต์ใหม่ มันก็อ่านภาษาต่างดาวนั้นไม่ออกอยู่แล้ว มันก็เลยขึ้น ????? ไปที่เว็บบอร์ดเลย

ผมคิดว่าผมต้อง save .sql ด้วย encoding ของ TIS-620 หรือเปล่าครับ ถ้าใช่... ผมจะปรับยังไงครับ

ขอคำตอบแบบฟังเข้าใจหน่อยนะครับ ผมยังเพิ่งอ่อนหัดในเรื่องนี้มาก

ปล. ถ้าเป็นไปได้ผมอยากให้ได้คำตอบโดยเร็วที่สุดนะครับ เพราะเว็บบอร์ดผมล่มมาหลายวันแล้ว กำลังหาทางเปลี่ยนโฮสต์อยู่ แต่ติดที่ปัญหาที่นี่ที่เดียว กลัวว่าเว็บเข้าไม่ได้นาน เดี๋ยวคนจะหายหมดน่ะครับ

ขอบคุณล่วงหน้าครับ

Get latest news from Blognone
By: sirn
WriteriPhone
on 17 May 2007 - 00:13 #23063

นั่นคือข้อเสียของคำว่า "เพราะถ้าในเว็บบอร์ดอ่านออก ผมก็ไม่เป็นไร" ครับ ลองอ่านที่นี่ครับ ปัญหาลักษณะคล้ายๆ กัน: ถามเรื่อง charset หน่อยครับ

ถ้าหากทำตามในกระทู้นั้น แล้วไม่เวิร์คก็: ก่อนอื่นไปเช็คว่าภาษาในไฟล์ .sql ที่ทำการดัมป์ออกมา เป็นภาษาไทยปกติ หรือว่าเป็น Latin แบบอ่านไม่ออก? และลองสั่ง SHOW VARIABLES LIKE '%character%'; จากทั้งสองเซิฟเวอร์มาให้หน่อยครับ หลังจากนั้น ค่อยว่ากันอีกที

By: Nattawat on 17 May 2007 - 00:28 #23066

ไฟล์ .sql ที่ดัมป์ออกมาไม่ได้เป็นภาษาไทยครับ มันเป็นแบบที่ผมอะไรประมาณนี้น่ะครับ --> à ÍÒææ áÅéÇ¡ÙÂÔ¹

---------------------

นี่เป็น Show variable ของเซอเวอร์ที่ผมจะ EXPORT นะครับ (โฮสต์ตัวเก่า)

Variable_name Value character_set_client utf8 character_set_connection utf8 character_set_database latin1 character_set_filesystem binary character_set_results utf8 character_set_server latin1 character_set_system utf8 character_sets_dir /data/mysql/zlaten/share/mysql/charsets/

-------

ส่วนนี่เป็น Show variable ของเซอเวอร์ที่ผมจะ IMPORT นะครับ (โฮสต์ใหม่)

Variable_name Value character_set_client utf8 character_set_connection utf8 character_set_database latin1 character_set_results utf8 character_set_server utf8 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/

By: iamcgi on 17 May 2007 - 00:46 #23067

กลัวลูกค้าหายแล้วจะหาเงินไม่ได้เหรอ ถ้าหาเงินได้ก่อนจะเอาไปทำอะไร ก็จ่ายเงินเด็กๆ ที่จ้างเค้าทำงานก่อนล่ะ

------------- ตายเพราะไต

By: Nattawat on 17 May 2007 - 00:50 #23068

อย่าไปนอกเรื่องสิครับ คุณ iamcgi

ไม่ว่าจะเป็นบอร์ดไหน ถ้าหากมี traffic ได้ที่แล้ว ย่อมไม่มีใครอยากให้เว็บล่มไปแบบไม่รู้สาเหตุหลายๆวันหรอกครับ

By: sugree
FounderWriterAndroidBlackberry
on 17 May 2007 - 01:20 #23073

เนื่องจากของเก่าเก็บเป็น latin1 ส่วนของใหม่เก็บ utf-8 ทำให้ต้องแปลงตามลำดับ latin1 -> tis-620 -> utf-8 แล้วค่อยเอาไปอิมพอร์ต

By: sirn
WriteriPhone
on 17 May 2007 - 04:46 #23077

บน Windows ผมไม่รู้แฮะว่าต้องทำยังไง (เรื่อง Convert) แต่อย่างที่คุณ Sugree บอก คือต้องแปลงไฟล์ sql จาก Latin1 ไปเป็น TIS-620 ก่อน เสร็จแล้วแปลงไปเป็น UTF-8 แล้วค่อยดัมป์ลงฐานข้อมูลครับ ถึงได้ แต่การทำแบบนั้น จำเป็นที่จะต้องเปลี่ยนหน้าเว็บไปให้เป็น UTF-8 ด้วยครับ

อีกทางเลือกนึงก็คือ แปลงเป็น TIS-620, แก้ Table Collation ให้เป็น TIS-620, แก้โค้ดของบอร์ด ให้บังคับ Connection เป็น TIS-620 (SET NAMES TIS-620;)

By: Nattawat on 17 May 2007 - 08:24 #23080

พอดีผมไปติดต่อกับโฮสต์มา ไม่รู้เขาทำอะไรเหมือนกันครับ แต่ตอนนี้อ่านภาษาไทยจากเว็บได้แล้ว

กลายเป็นเหมือนกับ database อันเก่าเลยครับ แบบว่าอ่านภาษาไทยในบอร์ดได้ แต่อ่านใน phpMyAdmin ไม่รู้เรื่อง

ถึงตอนนี้มันจะใช้ได้แล้ว แต่ผมกลัวว่ามันจะมีปัญหาอีกเพราะมันยังไม่เป็นภาษาไทยใน phpMyAdmin -- มีวิธีที่จะทำให้ตรงนี้อ่านภาษาไทยได้มั้ยครับ?

By: sirn
WriteriPhone
on 17 May 2007 - 17:29 #23117 Reply to:23080

เช็ค Collation ของตารางกับของ Database ดูครับ ว่าตอนนี้เป็น Latin1 หรือ TIS-620

By: ijook on 17 May 2007 - 09:25 #23082

ลองดูตัวอย่างวิธีทำให้ wordpress สามารถใช้ภาษาไทยได้อย่างไม่มีปัญหา จากประสบการณ์ของผมเองครับ wordpress Thai how to. และ upgrade wordpress to 2.2 Thai support.

ผู้ช่วยครู :) » มาทบทวนคณิตศาสตร์กับครูออนกันนะ

By: lancaster
Contributor
on 17 May 2007 - 19:39 #23120

export เป็น .sql แล้วเปลี่ยน charset ของ db เป็น tis-620 เสร็จแล้ว import กลับเข้าไปโดยกำหนด --default-character-set=tis620 ด้วยครับ

By: Nattawat on 18 May 2007 - 03:05 #23153

@sirn, collation ของตารางยังเป็น latin1 อยู่เลยครับ (อันนี้ไม่รู้แก้ไง)

@lancaster, เวลาผม export ออกมาแล้ว แล้วผมจะเปลี่ยน charset ต้องทำยังไงครับ (ใช้อะไรเปลี่ยนครับ)

By: sirn
WriteriPhone
on 18 May 2007 - 05:58 #23154

เคสของผมส่วนมากจะเป็นการแปลงจาก UTF-8 ใน Latin1 ไปเป็น UTF-8 เสียมากกว่า แต่คิดว่าคงจะคล้ายๆ กัน ทางที่ดีก่อนจะทำอะไร ควรสร้าง database สำรอง + บอร์ดสำรอง แล้วไปลองทำที่นั่นเอาน่าจะปลอดภัยที่สุดนะครับ

เรื่องการเปลี่ยน collation ของ table และ database สามารถไปปรับแก้ได้ทางแท็บ Operation ของ PHPMyAdmin ครับ แต่ผมไม่มั่นใจว่าการแปลงด้วยตรงๆ เลยในตอนนี้จาก Latin1 ไปเป็น TIS-620 เลยจะเป็นการทำให้เกิดปัญหา ??? ขึ้นอีกรอบหรือกลายเป็นตัวอ่านไม่ออกอีกหรือเปล่า (กลับด้านกัน กับปัจจุบัน ทำนองนั้น) [เพราะในกรณีของ UTF-8 จำเป็นต้องไปแก้ไฟล์ คล้ายๆ กับที่คุณ ijook บอกเสียก่อน]

ส่วนเรื่องการแปลง charset ของไฟล์ที่ export ออกมาแล้ว สามารถทำได้ด้วยการใช้ iconv โดยการสั่ง iconv.exe -f latin1 -t tis-620 "\path\to\file.sql" > "\path\to\newfile.sql" ครับ (อันiconv บนเว็บก็มี จะลองดูก็ได้) หลังจากนั้น อย่าลืม Replace latin1_general_ci (หรืออะไรก็ตาม) ภายในไฟล์ SQL ให้กลายเป็น tis620_thai_ci ด้วย ก่อนทำการ import เข้าไป เพื่อที่ MySQL จะได้เซ็ท character set ของ table ได้ถูกต้องครับ

สรุปเป็นขั้นตอนได้ประมาณนี้

  1. export ข้อมูลออกมา ทั้งๆ ที่มันยังเป็น Latin1 อยู่แบบนั้น
  2. เอา iconv แปลงไฟล์จาก Latin1 ไปเป็น TIS-620
  3. แก้ไข latin1_general_ci ในไฟล์ (ปกติจะอยู่ส่วนของ collate) ให้เป็น tis620_thai_ci
  4. import ไฟล์กลับเข้าไป ตรวจสอบความเรียบร้อย
  5. ถ้าหากใช้ไม่ได้ แปลว่า:
    • ต้องนั่งแงะโค้ด เพื่อเพิ่ม SET NAMES 'TIS-620'; ก่อนการ Query ทุกครั้ง... หรือ:
    • ไปบอกให้โฮสตั้ง character_set_connection เป็น TIS-620

โดยปกติแล้วผมมักจะยึด character set ของ PHPMyAdmin เป็นหลัก แล้วเน้นไปซ่อมเอาที่ตัวของเว็บ ของบอร์ดที่มีปัญหาเสียมากกว่าครับ (เพราะผม "คิด" ว่า PHPMyAdmin จะไม่มั่วเรื่อง Charset)