@blog.justoneplanet.info

日々勉強

MySQLサーバーをインストールして初期設定をする

■インストール

yum install mysql-server

PHPから使う場合は以下のようにphp-mysqlもインストールする。

yum install php-mysql

MySQLにアクセスする。

mysql -u root

■パスワード

アクセスできるのは良いんだがパスワードが設定されてないのはイカン。(・ε・)

SET PASSWORD FOR root@localhost=PASSWORD('fugafuga');

■データベース

ちょっとデータベースを作ってみる。

CREATE DATABASE `sample`;

■テーブル

ちょっとテーブルを作ってみる。

USE `sample`;
CREATE TABLE  `sample`.`tbl1` (
    `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
    `name` VARCHAR( 255 ) NOT NULL ,
    PRIMARY KEY (  `id` )
) ENGINE = MYISAM ;

■文字コード

ネットで探してもなかなか適切な文献が見当たらない。凄く深いので結論だけまとめておく。

ちょっとPHPからデータを入れてみる。

$dbh = mysql_connect(DB_HOST, DB_USER, DB_PASS);
mysql_select_db(DB_NAME, $dbh);
$query = "INSERT INTO `tbl1`(`name`) VALUES('山田');";
$result = mysql_query($query);

phpMyAdminで見てみると以下のように文字化けする。

capture

MySQLのデフォルト文字コードはlatin1になっている為だ。アプリケーション側で表示するときは特に文字化けすることはないかもしれないが、管理上は非常に面倒なのでデフォルト文字コードをutf-8にする事を強く勧める。

my.cnf(my.ini)

以下のようにする。

[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8

但しMySQLクライアントのコンパイルオプションによっては全然文字化けしまくる。従ってプログラム側での修正も必要だ。

PHP

mysql_connectを使う

mysql_connectを使用している場合は5.2.3以上が必須で、以下のようにクライアント側の文字コードを設定する。

$dbh = mysql_connect(DB_HOST, DB_USER, DB_PASS);
mysql_set_charset('utf8', $dbh);
PDOを使う

PDOを使用している場合は以下のように、MySQLの設定ファイルを読み込み、ATTR_EMULATE_PREPARESをfalseにしてサーバーサイドPrepared Statementを使うようにする。

$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME;
$dbh = new PDO(
    $dsn,
    DB_USER,
    DB_PASS,
    array(
        PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/my.cnf'
    )
);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

但し、MySQL<5.1の場合はクエリキャッシュが聞かないので注意が必要だ。現時点ではPDOでクライアント側の文字コードを指定する方法は無い。

誤り
  • 「SET NAMES utf8」クエリを発行する。
  • 「skip-character-set-client-handshake」をmy.cnfに記述する。
参考

「PHP5.2.3以前」かつ「PDOを使用できない」かつ「再コンパイルできない」とき文字コードの問題を完全に解決するのは不可能とのこと。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment