Moeの'は、その文字列がlatin1でエンコードされているが、mysqlサーバーがutf8を想定している場合に有効にならない、サンプル文字列内の唯一の文字です。
簡単なデモンストレーション:
<?php
function foo($s) {
echo 'len=', strlen($s), ' ';
for($i=0; $i<strlen($s); $i++) {
printf('%02X ', ord($s[$i]));
}
echo "\n";
}
// my file is latin1 encoded and so is the string literal
foo('Moe’s');
// now try it with an utf8 encoded string
foo( utf8_encode('Moe’s') );
プリント
len = 5 4D 6F 65 92 73
len = 6 4D 6F 65 C2 92 73
したがって、問題は次のとおりです。mysqlサーバーに「間違った」エンコーディングで何かをフィードしますか?
各接続には接続文字セットがあり、mysqlサーバーはクライアント(phpスクリプト)がその文字セットでエンコードされたデータを送信することを期待しています。接続文字セットが何であるかを知ることができます
SHOW VARIABLES LIKE '%character%'
のように
$mysql = mysql_connect('..', '..', '..') or die(mysql_error());
mysql_select_db('..', $mysql) or die(mysql_error());
$query = "SHOW VARIABLES like '%character%'";
$result = mysql_query($query, $mysql) or die(__LINE__.mysql_error());
while( false!==($row=mysql_fetch_array($result, MYSQL_ASSOC)) ) {
echo join(', ', $row), "\n";
}
これは次のようなものを印刷する必要があります
character_set_client, utf8
character_set_connection, utf8
character_set_database, latin1
character_set_filesystem, binary
character_set_results, utf8
character_set_server, utf8
character_set_system, utf8
「my」接続文字セットがutf8であることをcharacter_set_connection, utf8
示します。つまり、mysqlサーバーはクライアント(php)からutf8でエンコードされた文字を予期します。「あなたの」接続文字セットとは何ですか?
次に、パラメータ文字列の実際のエンコーディングを確認します。
$foo = mysql_real_escape_string($_POST['foo'], $mysql);
に置き換えます
echo '<div>Debug hex($_POST[foo])=';
for($i=0; $i<strlen($s); $i++) {
printf('%02X ', ord($_POST['foo'][$i]));
}
echo "</div>\n";
$foo = mysql_real_escape_string($_POST['foo'], $mysql);
入力文字列の実際のエンコーディングが何であるかを確認します。92またはC292を印刷しますか?