แก้ปัญหา charset ของ mysql กับปัญหาภาษาไทยอ่านไม่ออก?

lol ดีนะใครเช่ากับผมบอกลูกค้าก่อนว่าของผม uft8 ก่อนหมด จะได้ไม่มีปัญหาในการใช้งาน ขอบคุณสำหรับความรู้มากเลยพี่ฮ่าๆได้ความรู้เพิ่ม

ลองเอาอันนี้ไป ไม่รู้มีใครเอามาลงยัง

สรุปหลักการก็คือเมื่อมีการ connect mysql ที่มีการรับส่งภาษาไทยเมื่อไร ให้นำ TAG
mysql_query("SET NAMES ‘tis620’ "); ไปวางไว้หลังบรรทัดคำสั่ง mysql_connect หรือ mysql_pconnect ทันทีครับ ปัญหาเรื่องภาษาไทย กับ MySQL เวอร์ชั่น 4.1.X ก็จะหมดไปทันทีครับ แต่ก็ต้องไม่ลืมที่จะต้องตั้ง charset ต่างๆของฐานข้อมูลให้เป็น TIS620 ด้วยนะครับ ตรวจสอบลึกเข้าไปถึงในตารางด้วย ว่า charset ของแต่ละตารางเป็น TIS620 ด้วยหรือไม่ — สุดท้าย สคริปใดสามารถใช้งาน UTF-8 ได้ แนะนำให้ใช้ทันที เพราะจะทำให้ไม่ต้องแก้ tag ดังกล่าวข้างต้นที่กล่าวมาทั้งหมดครับ เพราะสามารถใช้งานในภาษาไทยได้ครับ ซึ่งสคริป ที่รองรับ UTF-8 ส่วนใหญ่จะเป็นสคริปที่ใหม่ๆครับ

http://www.meewebfree.com/technic/fix-thai-mysql-41x.htm

ตอนนี้ clippoo แก้ไขได้แล้วนะครับ ลองดูแนวทางแก้ของผม หลักๆคือ แก้ไขโครงสร้างตาราง ในฟิวด์ที่มีภาษาไทยไปเป็นแบบ binary ก่อน

เขียนอธิบายไว้หน้านี้ครับ

http://www.thaiseoboard.com/index.php/topic,27329.msg350602.html#msg350602

แต่ก่อนกลัวมาก…ตอนนี้หายใจเข้าออก เป็น UTF-8 แล้วครับ :slight_smile:

ปวดหัวๆ

ที่เก่า

[quote author=clubmusicza link=topic=6764.msg119471#msg119471 date=1215444104]
ปวดหัวๆ

ที่เก่า

Backup ออกมาให้เปิดข้อมูลใน text edit ทั่วไป เป็นภาษาไทยก่อน ถ้าผสม utf8 กับ tis620 ก็แยก Backup ออกเป็น2ชุด ชุด utf8 กับ ชุด tis
แล้วก็เลือกว่าจะใช้ tis หรือ utf8 ไม่ก็เล่นผสมแบบเดิมก็ได้

ผมต้องขอขอบคุณ คุณ pulanet เป็นอย่างสูงนะครับ ที่กรุณานำ Link ที่เป็นประโยชน์มาฝาก ผมใช้วิธีตามที่แนะนำไว้ในเว็บ itwizard.info สามารถแก้ปัญหาการแสดงผล ?? บนหน้าเว็บได้แล้วครับ (แต่ข้อมูลที่แสดงใน phpmyadmin ยังคงเป็น ?? อยู่เหมือนเดิม)

ข้อมูล Server ต้นทาง
MySQL Version 3.23.49
phpmyadmin Version 2.3.0
Charset = tis620

ข้อมูล Server ปลายทาง
MySQL Version 5.0
phpmyadmin Version 2.3.0
Charset = tis620

ใช้วิธีการ copy mysql data มาทั้ง folder (จาก Server1 –> Server2) ไม่ได้ทำการ Export/Import แต่อย่างใดครับ

วิธีการไข (ขออนุญาตคัดลอกจาก link ข้างต้นมาให้ดูด้วยนะครับ)

ได้ผลดีมาก สำหรับการแสดงผล หลังจาก query แล้ว บนหน้าเว็บ

<?
//กำหนด ชื่อดาต้าเบสเซิร์ฟเวอร์ , ชื่อฐานข้อมูล , ล็อกอิน และ รหัสผ่าน สำหรับติดต่อกับฐานข้อมูลให้กับตัวแปร
$ServerName = “localhost”;
$DatabaseName = “MyDatabase”;
$User = “root”;
$Password = “”;

//ติดต่อกับฐานข้อมูลผ่านฟังก์ชัน MySQL
$Conn = mysql_connect($ServerName,$User,$Password) or die (“ไม่สามารถติดต่อกับเซิร์ฟเวอร์ได้”);

//เลือกชื่อฐานข้อมูล คือ
mysql_select_db($DatabaseName,$Conn) or die (“ไม่สามารถติดต่อกับฐานข้อมูลได้”);

$cs1 = “SET character_set_results=tis620”;
mysql_query($cs1) or die('Error query: ’ . mysql_error());

$cs2 = “SET character_set_client = tis620”;
mysql_query($cs2) or die('Error query: ’ . mysql_error());

$cs3 = “SET character_set_connection = tis620”;
mysql_query($cs3) or die('Error query: ’ . mysql_error());
?>

มีคำถามนิดนึงครับ

ต้นทาง
phpMyAdmin 2.7.0-pl1
MySQL 4.0.24

ปลายทาง
phpMyAdmin - 2.11.2.2
MySQL 5.0.32

ผมก้อ export ออกมาปกติ ไม่มีเรื่อง ภาษาเข้ามาเกี่ยวเลย ในไฟล์ .sql ดูด้วย text editor ก้อเป็นภาษาไทยปกติ ใน phpmyadmin ก้อไทย
ถึงเวลา import ผมก้อ ไม่ได้เลือกไรเลยเช่นกัน import เลย ปรากฏว่า ขอม
เลยเอาใหม่ ลองเลือก ชุดอักขระของไฟล์ (character set): tis620 (อยู่ใต้ browse เดิมๆ มันจะเป็น utf8) มันก็ยังขอม
เลยเอาใหม่อีก ลองเลือก ข้างล่างด้วย ตรง SQL compatibility mode เดิมเป็น NONE ก็เลือกเป็น MYSQL40 ก็ยังขอมอีก
เลยไม้ตาย

[client]
default-character-set = tis620

[mysqld]
default-character-set = tis620
character-set-server = tis620
collation-server = tis620_thai_ci
init_connect = 'SET collation_connection = tis620_thai_ci’
init_connect = ‘SET NAMES tis620’

อัดไปใน my.conf ก็หาย
แต่ถ้าเป็นแบบนี้เวลาใช้ utf8 ก็ต้องมาคอย SET NAMES UTF8
แต่เอ่ … (ถึงคำถามสะที) แล้วแบบนี้ เราจะ up มาใช้ mysql 5 ทำเนี่ยในเมื่อ utf ก็ไม่ได้ใช้
ไหนเห็นเค้าว่า utf8 support ตัวอักษรทั่วโลก แต่ไม เรายังคงต้องมานั่ง ใช้ fix tis620 กันอยู่ สงสัยจริงๆ

หรือตัวผมเองที่ทำอะไรผิดไป :blink:

ผมเองก็ไม่ค่อยเข้าใจเกี่ยวกับรหัสภาษาที่เขากำหนดมาให้ใช้นะครับ โดยส่วนตัวชอบใช้ tis-620 เพราะคนส่วนใหญ่นิยมใช้กัน แต่ก็เคยเห็นมีคนออกมารณรงค์ให้เปลี่ยนไปใช้ utf-8 แทน แต่ผมลองใช้แล้วไม่เห็นจะดีเลย มีปัญหาการแสดงผลภาษาไทยตลอด

ตอนนี้วิธีแก้ปัญหาเบื้องต้นของผมก็คือ แก้ไข script php mysql connection ตามกระทู้ข้างบนเพื่อให้แสดงผลหน้าเว็บได้ถูกต้องก่อน ส่วนข้อมูลใน table ก็ยังคงเป็น ?? เหมือนเดิม ก็ปล่อยไว้แบบนั้น

ลองดูนี่ อ่ะคับ

http://appservnetwork.com/modules.php?name=News&file=article&sid=3

ที่โพสนี่คือแค่สงสัยว่า update โปรแกรมให้ใช้ unicode แต่ไง๋ ต้องมานั่งใช้ tis620 เหอๆ

mysql 4.0 ยังไม่รองรับ utf8 ครับ ดังนั้น charset จะเป็น latin1
ส่วนหน้าเว็บก็น่าจะเป็น charset tis-620 ซึ่งเก็บลงตาราง latin1 ไม่มีปัญหา
export ออกมาก็จะอ่านไทยออกตามปกติ

[quote author=test link=topic=6764.msg126307#msg126307 date=1218727364]
ปลายทาง
phpMyAdmin - 2.11.2.2
MySQL 5.0.32

ผมก้อ export ออกมาปกติ ไม่มีเรื่อง ภาษาเข้ามาเกี่ยวเลย ในไฟล์ .sql ดูด้วย text editor ก้อเป็นภาษาไทยปกติ ใน phpmyadmin ก้อไทย
ถึงเวลา import ผมก้อ ไม่ได้เลือกไรเลยเช่นกัน import เลย ปรากฏว่า ขอม
เลยเอาใหม่ ลองเลือก ชุดอักขระของไฟล์ (character set): tis620 (อยู่ใต้ browse เดิมๆ มันจะเป็น utf8) มันก็ยังขอม
เลยเอาใหม่อีก ลองเลือก ข้างล่างด้วย ตรง SQL compatibility mode เดิมเป็น NONE ก็เลือกเป็น MYSQL40 ก็ยังขอมอีก
เลยไม้ตาย

[client]
default-character-set = tis620

[mysqld]
default-character-set = tis620
character-set-server = tis620
collation-server = tis620_thai_ci
init_connect = ‘SET collation_connection = tis620_thai_ci’
init_connect = ‘SET NAMES tis620’

อัดไปใน my.conf ก็หาย
แต่ถ้าเป็นแบบนี้เวลาใช้ utf8 ก็ต้องมาคอย SET NAMES UTF8
แต่เอ่ … (ถึงคำถามสะที) แล้วแบบนี้ เราจะ up มาใช้ mysql 5 ทำเนี่ยในเมื่อ utf ก็ไม่ได้ใช้
ไหนเห็นเค้าว่า utf8 support ตัวอักษรทั่วโลก แต่ไม เรายังคงต้องมานั่ง ใช้ fix tis620 กันอยู่ สงสัยจริงๆ

หรือตัวผมเองที่ทำอะไรผิดไป

สอบถามครับ

จะ dump ข้อมูลจาก db เก่าไป db ใหม่ ข้อมูลเบื้องต้นมีดังนี้ครับ

ระบบเก่า

  • MySQL 4.1.20
  • phpMyAdmin 2.5.3-rc2
  • จากที่เปิดดูโดยใช้ phpmyadmin ไม่ได้ระบุไว้ว่า charset ของ db กับ table เป็นอะไร (งงเหมือนกันว่าทำไมไม่ได้ระบุไว้หว่า) แต่คิดว่าเป็น latin1 ครับ
  • Server variables
    character_set_client latin1
    character_set_connection latin1
    character_set_database latin1
    character_set_results latin1
    character_set_server latin1
    character_set_system utf8
    character_sets_dir /usr/share/mysql/charsets/
    collation_connection latin1_swedish_ci
    collation_database latin1_swedish_ci
    collation_server latin1_swedish_ci

ระบบใหม่

  • MySQL 5.0.51
  • phpMyAdmin 2.11.8.1
  • Server variables
    character_set_client latin1
    character_set_connection latin1
    character_set_database latin1

ลองเปลี่ยนจาก mysql_query(‘SET NAMES tis620’); เป็น mysql_query(‘SET NAMES latin1’); ดูครับ

ก่อนอื่นผมต้องบอกก่อนว่า ไม่ได้ทำการ export แล้ว import ฐานข้อมูลมาจากไหน
ผมเริ่มต้นทุกอย่างใหม่ทั้งหมด

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

ในเครื่อง Windowns ของผม จำลอง server ไว้ มีรายละเอียดดังนี้นะครับ
Server version: 5.0.24a-community-nt-log
phpMyAdmin - 2.9.0.2
ตั้ง Collection เป็น tis620_thai_ci
และ MySQL connection collation utf8_unicode_ci

แต่พอผม Up Files ขึ้น Server ซึ่งเป็น Linux ครับ
Server Linux ที่ผมใช้ รายละเอียดดังนี้นะครับ
Server version: 4.1.10-standard-log
phpMyAdmin - 2.11.4
โดยตั้ง Collection เป็น tis620_thai_c
และ MySQL connection collation utf8_unicode_ci

เหมือนที่ผมจำลอง Server ในเครื่องตัวเองทุกอย่าง
แต่การแสดงผลกลับกลายเป็น ? ? ? ? ? ? รวมทั้งบันทึกลงฐานข้อมูลก็เป็น ? ? ? ? ? ? ? ? ด้วย

แต่ถ้าผมติดตั้งฐานข้อมูลใหม่ โดยกำหนด Collection เป็น latin1_swedish_ci
การแสดงผลหน้าเวปจะเป็นภาษาไทยถูกต้อง แต่ข้อมูลที่ถูกบันทึกลง MySQL กลับเป็นภาษาที่ไม่ใช่ภาษาไทยอีกแล้ว

อย่างเช่นส่งค่าเป็น สสสสสส แต่บันทึกค่าเป็น iiiiiiiii ครับ และแสดงผลเป็น สสสสสส ถูกต้อง

ผมอยากจะบันทึกลงฐานข้อมูลเป็นภาษาไทยทุกอย่าง เผื่อเกิดความผิดพลาดในอนาคต
ผมจึงใส่ mysql_query(“SET NAMES ‘tis620’”); ลงไปใน file php ที่ connect กับ ฐานข้อมูล
ปรากฎว่ามีการบันทึกข้อมูล และแสดงผลเป็นภาษาไทยถูกต้องเลยครับ

จึงอยา่กสอบถามดังนี้ครับ

1. ผมแก้ปัญหาถูกต้องแล้วใช่ไหมครับ ที่ใส่ mysql_query(“SET NAMES ‘tis620’”); ลงไปด้วย

[b]2.อย่างเช่นส่งค่าเป็น สสสสสส แต่บันทึกค่าเป็น iiiiiiiii ครับ และแสดงผลเป็น สสสสสส ถูกต้อง

ผมอยากทราบว่า การบันทึกข้อมูลเป็นอักขระ แบบนั้น จะมีผลกับข้อมูลมั้ยครับ
ถ้าจะ back up database ไปใช้กับ MySQL หรือ phpMyAdmin version อื่นๆ[/b]

3.

Server version: 5.0.24a-community-nt-log
phpMyAdmin - 2.9.0.2
ตั้ง Collection เป็น tis620_thai_ci
และ MySQL connection collation utf8_unicode_ci


และ

Server version: 4.1.10-standard-log
phpMyAdmin - 2.11.4
โดยตั้ง Collection เป็น tis620_thai_c
และ MySQL connection collation utf8_unicode_ci

[b]มันมีึความแตกต่างกันอย่างไรครับ ทำไมผมถึงเซตค่าทุกอย่างเหมือนกัน แต่ทำไมพอถึงเวลาจริงกลับบันทึกค่าไม่เหมือนกันครับ
แล้วทำไมต้องใส่ mysql_query(“SET NAMES ‘tis620’”); เพิ่มลงไปด้วย ทั้งๆที่ทดสอบในเครื่องตัวเองไม่ผิดปกติอะไรเลย

  1. ผมเจอตัวอย่าง file นึงที่ทดสอบแล้วไม่ได้ผล (D/L sorce มาจากเวปของเมืองนอก)
    คือ ใน file connect ของเค้าเขียนออกมาเป็น Function ผมไม่รู้ว่าจะใส่ mysql_query(“SET NAMES ‘tis620’”); ตรงไหน
    เพราะลองใส่แล้ว ไม่ได้ผล ช่วยดูให้ผมทีครับ[/b]

[quote]<?php

include(“const.inc.php”);

Class DBSQL
{

เปิด phpmyadmin->Show MySQL system variables เอาค่าตัวแปลเหล่านี้มาให้ดูหน่อยครับ ทั้ง localhost และโฮสที่ใช้งานจริง
character set client

ของ Localhost เป็นดังนี้ครับ

[quote]character set client

1.แล้วในกรณีนี้ Host ของผมเป็น latin1 ผมควรแก้ไขอย่างไรครับ

ขอบคุณพี่ jirawat มากคับ

สำหรับความรู้ในครั้งนี้

เกิดคำถาม ขึ้นมาอีกแล้วล่ะครับ
ด้วยความที่ตอนนี้ ผมมีเวปอยู่ในสังกัดหลายเวป เหมือนกัน (ค่อยๆทำทีละเวปๆ)
ขอนอกเรื่องนิดนึงนะครับ
(:angryfire: :angryfire: :angryfire: แต่เวปนึงของผมที่มีสมาชิก 50000 คน โดนปิดครับผมเศร้ามาก Host ที่เช่าไว้เค้าปิดตัวลงโดยไม่บอกไม่กล่าว ปืดเบอร์โทร ติดต่อไม่ได้ แจ้งความตำรวจก็ช่วยไรไม่ได้ ไม่เหลือแม้กระทั่งข้อมูลอะำไรเลย ผมพลาดเอง :angryfire: :angryfire: :angryfire:)

จนตอนนี้มีความคิดว่า น่าจะจับเวปของผมเหล่านั้นเข้ามาอยู่ที่ server เดียวกันทั้งหมดไปเลยดีกว่า แต่ติดตรงที่ บางเวปของผม
ฐานข้อมูลที่เป็น tis-620 บ้าง (เก็บข้อมูลเป็น อักษรภาษาไทย)
บางเว็ปก็เก็บข้อมูลเป็น latin1 (เก็บข้อมูลเป็นอักขระแปลกๆ)

ผมจึงเกิดข้อสงสัยว่า ถ้าผมจะย้าย ฐานข้อมูลทั้งหมดมาใช้ server ที่้เป็น ข้อมูลที่เป็น tis-620
ในเวปที่เป็น tis620 อยู่แล้ว ผมคิดว่าไม่น่ามีปัญหาอะไรมาก
แต่เวปที่เป็น latin1 สิครับ หลังจากที่ผมแบกอัพ จาก phpmyadmin ออกมาก
ผมจะมา convert อักขระเหล่านั้น ให้กลับมาเป็นภาษาไทย เพื่อใช้ใน ฐานข้อมูลที่เป็น tis-620 ได้อย่างไรหรอครับ

ช่วยสอนผมที ผมก็แบบ งูๆปลาๆ มากครับ ลองอ่านบทความแล้วจนปวดหัว ก็ัยังไม่เข้าใจอยู่ดี
แต่ก่อนไม่เคยได้สังเกตุเรื่อง ฐานข้อมูลมากมาย ว่ามันเก็บข้อมูลเป็นอย่างไร ขอแค่แสดงผลถูกต้องก็พอ
แต่พอมาเจอเรื่อง เวปหายไปทั้งเวป ผมเลยอยากจะศึกษาเรื่องนี้แล้วล่ะครับ

ขอบคุณพี่ jirawat อีกครั้งครับ