PDOでSJISだめっぽというので調べてみた
だめっぽ。
環境
Windows
PHP 5.2.3
MySQL 5.0.41
my.iniの設定
[mysqld]
default-character-set=CP932
skip-character-set-client-handshake
<?php
$mysql = mysql_connect('localhost', 'root', '');
mysql_select_db('test');
echo mysql_client_encoding(); // latin1
echo mysql_real_escape_string('ソン'); // ソ\ン
mysql_close($mysql);
$mysqli = mysqli_connect('localhost', 'root', '', 'test');
echo mysqli_client_encoding($mysqli); // latin1
echo mysqli_real_escape_string($mysqli, 'ソン'); // ソ\ン
mysqli_set_charset($mysqli, 'cp932');
echo mysqli_client_encoding($mysqli); // cp932
echo mysqli_real_escape_string($mysqli, 'ソン'); // ソン
mysqli_close($mysqli);
$pdo = new PDO('mysql:dbname=test;host=localhost', 'root', '');
echo $pdo->quote('ソン'); // 'ソ\ン'
?>
SHOW VARIABLES LIKE “char%”ではclientの文字セットがutf8とでるんですが、クライアントのdll自体がlatin1で動作しちゃってる為使えないです。
mysqliの場合は5.2.3で追加されたmysqli_set_charsetで変更できますが。
PDOに関しては、文字コードナニそれ?って感じでしょう。
プレースフォルダ機能つきプリペアードステートメントが文字コード考慮してなくてどうする。
<?php
$mysql = mysql_connect('localhost', 'root', '');
$result = mysql_query('SHOW VARIABLES LIKE "char%"');
while ($row = mysql_fetch_assoc($result)) {
echo "|{$row['Variable_name']}\t|{$row['Value']}\t|\n";
}
/*
|character_set_client |cp932 |
|character_set_connection |cp932 |
|character_set_database |cp932 |
|character_set_filesystem |binary |
|character_set_results |cp932 |
|character_set_server |cp932 |
|character_set_system |utf8 |
|character_sets_dir |C:\Program Files\MySQL\MySQL Server 5.0\share\charsets\ |
*/
?>
カテゴリー: 日記