■インストール
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で見てみると以下のように文字化けする。
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に記述する。
参考
- PHPとSET NAMES問題のまとめ
- PHPでmysqlを適切に扱う方法
- mysqlでskip-character-set-client-handshakeはもう使わないほうがいいと思われ
- SET NAMESは禁止
「PHP5.2.3以前」かつ「PDOを使用できない」かつ「再コンパイルできない」とき文字コードの問題を完全に解決するのは不可能とのこと。