วันอาทิตย์ที่ 22 กรกฎาคม พ.ศ. 2555

Fix mysql database utf8 and tis620 encoding

ปัญหาการ encoding ของ database ไม่ถูกต้องซึ่งทำให้ภาษาไทยไม่แสดงผล มีหลายกรณีด้วยกันครับ

สำหรับการแก้ปัญหาที่ยกตัวอย่างมานี้
จะเป็นวิธีการแก้ไข encoding ของ database ที่ถูกป้อน
ข้อมูลผ่าน php โดยไม่ได้กำหนดค่า set names utf8 หรือ set names tis620
ทำให้ names default mysql ถูกใช้ซึ่งปกติจะเป็น latin1


ขั้นที่ 1. export ไฟล์เป็น .sql ผ่าน phpmyadmin เป็น utf8 (เป็นค่า default อยู่แล้ว)
ขั้นที่ 2. สร้าง database ใหม่เป็น utf8 สำหรับทดสอบ สร้างตารางชื่อ test ขึ้นมาและสร้าง field ขึ้นมา field หนึ่งเป็น long_text ตั้งชื่อว่า field1
ขั้นที่ 3. เพิ่ม record ของตาราง test ขึ้นมา โดย copy โค้ดจากไฟล์ .sql มาใส่ไว้ใน field1 
ขั้นที่ 4 แทรกคำสั่ง set names latin1; จากนั้นแสดงผล field1 ของตาราง test
ขั้นที่ 5 จะได้ข้อมูลโค้ดจากไฟล์ .sql ในรูปแบบภาษาไทยที่ถูกต้อง นำไปใช้ import ได้
(ขั้นที่ 5 ถ้าแสดงผลใน browser จะต้องกำหนดค่า charset utf8)


ถ้าต้องการให้ช่วยแปลงข้อมูลภาษาไทยที่ผิดปกติ
สามารถติดต่อได้ที่ 0897902424 (หนุ่ม)
คิดค่าบริการประมาณ 200-1000 โดยขึ้นอยู่กับจำนวนตารางข้อมูลครับ

วันจันทร์ที่ 2 กรกฎาคม พ.ศ. 2555

mysql-transaction-example

โปรแกรมที่มีคนใช้กันหลายคนจะมีโอกาสที่เกิดเหตุการณ์บันทึกข้อมูลผิดพลาดได้ง่าย
ให้ใช้ transaction ในการ commit ถ้าข้อมูลถูกต้องแล้ว เพื่อทำการบันทึกจริง
และ rollback เมื่อตรวจสอบแล้วพบว่าข้อมูลผิดพลาดเพื่อย้อนกลับไปเหมือนยังไม่เคยเกิดเหตุการ update ใดๆ

<?php
/*
CREATE TABLE `x` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(10) NOT NULL DEFAULT '0',
`qty` INT(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
ENGINE=InnoDB ROW_FORMAT=DEFAULT
*/


$rs = mysql_connect('localhost','root','');
mysql_select_db('xx');
mysql_query('set names utf8');

mysql_query('SET autocommit = 0');
mysql_query('START TRANSACTION');

mysql_query('update x set qty=qty-5');
$rs = mysql_query('select qty from x where id=1');
if (mysql_result($rs,0) > 0)
mysql_query('COMMIT');
else
mysql_query('ROLLBACK');
mysql_query('SET autocommit = 1');

?>