Php 奇怪的MySQL字符集问题:错误号1366:字符串值不正确

Php 奇怪的MySQL字符集问题:错误号1366:字符串值不正确,php,mysql,character-encoding,Php,Mysql,Character Encoding,我有一个PHP脚本,它接收POST参数并将它们保存到数据库中。脚本本身工作正常,但如果任何POST参数包含希伯来文文本,则会出现以下错误: error number 1366: Incorrect string value: '\xF2\xE9\xE3\xE5 \xF7...' for column 'Name' at row 1 列定义为: `Name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,

我有一个PHP脚本,它接收POST参数并将它们保存到数据库中。脚本本身工作正常,但如果任何POST参数包含希伯来文文本,则会出现以下错误:

error number 1366: Incorrect string value: '\xF2\xE9\xE3\xE5 \xF7...' for column 'Name' at row 1
列定义为:

`Name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
表和数据库也被定义为字符集utf8 COLLATE utf8\u general\u ci。此外,在运行查询之前,会对查询执行stripslashes

奇怪的是,原来的列定义没有包括字符集和COLLATE。当它没有这些时,通过MySQL Workbench运行同一个带有希伯来语字符的insert语句,得到了相同的错误——但只是作为一个警告。然后,我向列定义中添加了字符集和COLLATE参数,重建了表,并通过Workbench再次运行了我的查询——一切正常

。。。但是PHP脚本仍然返回此错误

有人知道为什么会这样吗?我是否可以抑制SQL语句本身中的警告,以便忽略这些警告

编辑: PHP代码:

function dbConnect() {
    global $host, $user, $pwd, $db, $MYSQL_ERRNO, $MYSQL_ERROR;
    $dbConn = mysql_connect($host,$user,$pwd);
if (!$dbConn) {
    $MYSQL_ERRNO = 0;
    $MYSQL_ERROR = "Could not connect to $host";
    return false;
} else if ($db && !mysql_select_db($db)) {
    $MYSQL_ERRNO = mysql_errno();
    $MYSQL_ERROR = mysql_error();
    return false;
} else {
    return $dbConn;
}
}

$link = dbConnect() or die(sql_error());
$query="INSERT INTO maillist (Name,LastName,email,status,sex,City,date_added) VALUES (N'".filter_var($_POST['Name'], FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES)."',N'',N'".filter_var($_POST['email'], FILTER_SANITIZE_EMAIL)."','0',N'',N'',CURDATE())";
$query = stripslashes($query);
$result = mysql_query($query,$link) or die(sql_error());

马克解决了,我找到了解决办法

是的

[mysqld] 字符集服务器=utf8应更改为latin1


重新启动mysql

向我们展示您的查询和php。好吧,您要插入的不是UTF-8。。。它是ISO-8859-15中的
“òå÷”
。确保您知道输入内容,并在连接上设置正确的字符集。如果你是utf-8,你的网站应该是你能确认xF2xE9xE3。。。一个或多个UTF-8编码的希伯来文字符是否正确?如果不是,stripslashes()调用可能会破坏希伯来文字符(碰巧包含\?)我也很好奇为什么会从数据库查询中剥离斜杠——通常会添加斜杠以禁用数据中的。无论如何,试着注释掉斜杠,然后看看它是否有效(证明这就是问题所在)。我认为stripslashes()不支持UTF-8。stripslashes实际上是错误地出现在那里的,感谢Phil发现了这一点,但删除它并没有帮助@Wrikken-我无法更改原始页面的编码,但运行mb_convert_编码($_POST['Name'],'utf-8','ISO-8859-8')解决了此问题。谢谢大家的帮助!啊,是的,在不同的角色集中,它可能是希伯来语,不太熟悉那些。只是错误消息中的一个表示形式,向您显示它不是裸字符串
xF2xE9xE3
,而是字节的十六进制表示形式。注:顺便说一句:如果您的整个站点都是按照ISO-8859-8标准运行的,那么最好将数据库连接设置为该字符集,而不是转换单个输入:
将名称设置为“希伯来语”将在这里执行。运行
显示字符集查看是否有可用的代码。