การกำหนดให้ MySQL ใช้ utf-8 เป็นค่า default

การกำหนดให้ MySQL ใช้ utf-8 เป็นค่า default สามารถทำได้โดยการแก้ไข /etc/my.cnf ดังนี้

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
default-character-set = utf8
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

MySQL: ย้ายข้อมูลระหว่างฐานข้อมูล

วิธีการง่ายๆ ในการย้ายข้อมูลระหว่าง  database สามารถทำได้ดังนี้

  1. สร้างฐานข้อมูลใหม่ เช่น  new_database
  2. ใช้คำสั่ง mysqldump ดังนี้
    #mysqldump -uroot -p old_database | mysql -uroot -p -D new_database

สิ่งที่ควรทำหลังจาก upgrade MySQL server

หลังจากทำการ upgrade MySQL server ควรจะใช้คำสั่งต่อไปนี้
#mysql_upgrade -uroot -p
และ

#mysqlcheck -uadmin -p --auto-repair --check --optimize --all-databases

เพื่อตรวจสอบว่ามีปัญหาระหว่างการ upgrade หรือไม่ เนื่องจากผมเจอปัญหาที่ดูเหมือนว่าฐานข้อมูลหายไป เมื่อตรวจสอบแล้วก็พบว่าฐานข้อมูลยังอยู่ แต่ถูกเติมข้างหน้าด้วย #mysql50#

If you have databases or tables from a version of MySQL older than 5.1.6 that contain special characters and for which the underlying directory names or file names have not been updated to use the new encoding, the server displays their names with a prefix of #mysql50# in the output from INFORMATION_SCHEMA tables or SHOW statements.

ที่มา http://dev.mysql.com/doc/refman/5.1/en/identifier-mapping.html

InnoDB กับ Lock wait timeout exceeded!

ผมใช้ innoDB  ใน MySQL แล้วเจอข้อความ error นี้

Lock wait timeout exceeded; try restarting  transaction

วิธีแก้ปัญหาที่ทำตอนนี้คือเปลี่ยนกลับไปใช้ MyISAM เหมือนเดิมก่อน

Set MySQL Auto Increment Manually

ในกรณีที่ต้องการกำหนดค่า auto increment ใหม่ สามารถทำได้ตามรายละเอีดข้างล่างนี้

I have a database table with a auto increment column for primary key. As the records being add and delete many times, the auto increment value will keep increasing.

Problem One:
If I have entered 10 records, and deleted 9th, 10th records. The next auto increment value will be 11, not 9.

Solution:
Run a query:

ALTER TABLE tablename AUTO_INCREMENT = 1

This will reset the next auto increment value to current largest value in the auto increment column + 1. So, the auto increment value of next inserted record will start from 9.

Problem Two:
If I have entered 10 records, and deleted center records – 4th, 5th. I want to insert next record as 4th not 11th.

Solution:
Run the following query:

SET insert_id = 4;
INSERT INTO tablename VALUES ('blah', '...');

This will add the next record into record 4th.

The SET insert_id = #(where # is the next auto increment value you want to use) will reset the next auto increament value, the next query(INSERT) you run will use your choice of value.

Note: only effective for the immediate next query, one time.

Source: http://www.liewcf.com/archives/2004/04/mysql-reset-auto-increament-number/

ค้นหาค่า auto_increment ของ table ด้วย MDB2

        $sql = "SHOW TABLE STATUS LIKE 'table_name'";
        $res = $mdb2->query($sql);
        if (PEAR::isError($res)) {
            die($res->getMessage());
        }
        $result = $res->fetchRow();
        $next_id = $result['auto_increment'];

ภาษาไทยกับ PHP และ MySQL

UTF-8 เป็นคำตอบสุดท้่าย เพื่อให้การใช้ภาษาไทยกับ PHP และ MySQL ใช้งานได้อย่างสมบูรณ์

การสร้างฐานข้อมูลใน MySQL

ให้ตั้งค่าดังต่อไปนี้

  • Default CHARSET = utf8
  • COLLATE = utf8_unicode_ci

ตัวอย่างเช่น

CREATE TABLE brand (
pk_brand int(5) NOT NULL auto_increment,
brand varchar(250) collate utf8_unicode_ci NOT NULL,
brand_logo varchar(200) collate utf8_unicode_ci NOT NULL,
website varchar(200) collate utf8_unicode_ci default NULL,
PRIMARY KEY  (pk_brand)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

แล้วทำไมจึงไม่ใช้ utf8_general_ci?  อ่านได้ที่นี่

การเชื่อมต่อจาก PHP ไปยัง MySQL

หลังจากที่เชื่อมต่อกับฐานข้อมูลแล้วให้ส่ง query ต่อไปนี้ด้วย (ทำแค่ครั้งเดียว)

  • set NAMES utf8

ขอให้สังเกตว่า ใช้ utf8  ไม่ใช่  utf-8  ตัวอย่างเช่น

<?php
// Database connection for abstract
$dsn = 'mysql://username:password@localhost/database';
$mdb2 =& MDB2::factory($dsn);
if (PEAR::isError($mdb2)) {
    die ($mdb2->getMessage());
}
// set fetchmode
$mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);
$mdb2->query('set NAMES utf8');
?>

การเขียน META TAG ใน HTML Code

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello!</title>
</head>

🙂

PHP5 กับ MySQL bug?

หลังจากที่ผมได้ทำการติดตั้ง Apache 2.0.50 กับ PHP5 ไปแล้ว ทุกอย่างก็เหมือนจะทำงานได้ดีจนกระทั่ง ผมจะเพิ่ม extension ของ php_mysql.dll เพื่อให้ PHP สามารถติดต่อกับ MySQL ได้ ปรากฎว่าทำยังไงก็ไม่สามารถเพิ่ม mysql extension ได้ และจะเกิดข้อความ error แบบตัวอย่างข้างล่างนี้แหละ ซึ่งทำให้งง เพราะไฟล์มันก็อยู่ถูกที่แล้ว ลองกี่ทีๆ ก็เหมือนกัน

ข้อความเขียนไว้ว่า
PHP Startup: Unable to load dynamic library ‘d:program filesphpextphp_mysql.dll’ – The specified module could not be found.

เลยลองเข้าไปหาดูในเว็บ พบว่ามีคนโวยวายไว้ที่นี่เหมือนกัน http://bugs.php.net/bug.php?id=29224

ผมลองทำตามที่เขาเขียนไว้ แต่ก็ไม่ได้ผล ก็เลยลองใหม่ สิ่งที่ผมทำก็คือ
1. แก้ไข php.ini ให้เรียก module mysql ด้วยคำสั่ง
extension=php_mysql.dll

2. copy ไฟล์ libmysql.dll ไปไว้ที่ d:/windows/system32/

3. อย่าลืม restart Apache Web Server ใหม่

ปรากฎว่าคราวนี้ได้ผลแฮะ!

แล้วผมก็เจอคำตอบที่ FAQ ของ PHP ที่นี่ เจ้าตัว MySQL client libaries ไม่ได้ถูก bundle มากับ PHP5 นี่เอง นอกจากนี้ยังแนะนำให้ใช้ MySQLi แทนด้วย เพราะเนื่องจากว่าเจ้า MySQL extension ตัวที่มากับ PHP5 นั้นไม่ได้สนับสนุนฟังก์ชันต่างๆ ของ MySQL ในเวอร์ชันที่มากกว่า 4.1.0 ด้วย

งั้นผมลองเปลี่ยนมาใช้ MySQLi ดีกว่า วิธีการก็คือ
1. comment MySQL ซะ ด้วยการเติม ; ไปข้างหน้า
;extension=php_mysql.dll

2. เรียก module MySQLi ด้วยการเพิ่มคำสั่ง
extension=php_mysqli.dll

3. copy ไฟล์ libmysqli.dll ไปไว้ที่ d:/windows/system32/

4. อย่าลืม restart Apache Web Server ใหม่