Moe's 中的 ' 是示例字符串中唯一无效的字符,如果该字符串是 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
和character_set_connection, utf8表示“我的”连接字符集是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 还是 C2 92?