文字エンコーディングは、シナリオの複数の場所でルールを果たします
- パラメータをサーバーに送信するためにクライアントが使用するエンコーディング
- PHPスクリプトからサーバーに送信される文字を解釈するためにmysqlサーバーが使用するエンコーディング
- 結果をphpスクリプトに送り返すためにmysqlサーバーが使用するエンコーディング
- mysql サーバーがデータを格納するために使用するエンコーディング
- phpスクリプトからクライアント/ブラウザに送信されるデータをレンダリングするために、クライアント/ブラウザが使用するエンコーディング
チェーン全体を utf-8 エンコーディングに保つのが最も簡単です:
ブラウザに送信する html ドキュメントの文字エンコーディングを、たとえばdefault_charsetを介して utf-8 に設定します。PDO-MYSQL DSN
で charset プロパティを設定するなどして、接続文字セットが utf-8 であることを mysql サーバーに示します。
デフォルトの文字セットとして utf-8 を使用し、フィールド自体に別のエンコーディングを指定せずにテーブルを作成します。
自己完結型の例:
<?php
ini_set('default_charset', 'utf-8');
$fn = isset($_POST['val']) ? 'doDatabase' : 'doForm';
doHtml($fn);
function doHtml($fn) { ?>
<html>
<head><title>...</title></head>
<body>
<?php $fn(); ?>
</body>
</html>
<?php
}
function doForm() { ?>
<form method="POST" action="?">
<div>
<input type="text" name="val" value="®" />
<input type="submit" />
</div>
</form>
<?php
}
function doDatabase() {
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->exec('
CREATE TEMPORARY TABLE soFoo (
id int auto_increment,
val varchar(30),
primary key(id)
) DEFAULT CHARACTER SET utf8
');
$stmt = $pdo->prepare('INSERT INTO soFoo (val) VALUES (?)');
$stmt->execute( array($_POST['val']) );
$stmt = null;
foreach( $pdo->query('SELECT * FROM soFoo', PDO::FETCH_ASSOC) as $row ) {
echo 'row: ', join(', ', $row), "<br />\r\n";
}
}