【问题标题】:Weird MySQL character set trouble: error number 1366: Incorrect string value奇怪的 MySQL 字符集问题:错误号 1366:字符串值不正确
【发布时间】:2013-12-10 19:11:56
【问题描述】:

我有一个 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,

表和数据库也定义为CHARACTER SET utf8 COLLATE utf8_general_ci。此外,在查询运行之前,会在查询上执行 stripslashes。

奇怪的是,原来的列定义没有包括 CHARACTER SET 和 COLLATE。当它没有这些时,通过 MySQL Workbench 使用希伯来语字符运行相同的插入语句会得到同样的错误 - 但只是作为警告。然后我将 CHARACTER SET 和 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());

【问题讨论】:

  • 向我们展示您的查询和您的 php。
  • 嗯,您要插入的不是 UTF-8... 它是 ISO-8859-15 中的 "òéãå ÷"。确保您知道您的输入是什么,并在您的连接上设置正确的字符集。如果你要使用 utf-8,你的网站应该是 utf-8 all the way through
  • 你能确认 xF2xE9xE3... 是一个或多个正确的 UTF-8 编码的希伯来字符吗?如果没有,stripslashes() 调用可能会损坏希伯来字符(恰好包含一个 \ ?)我也很好奇你为什么要从数据库查询中删除斜杠 - 通常你会添加斜杠来禁用'在数据中。无论如何,尝试注释掉stripslashes,然后看看它是否有效(证明这是问题所在)。我认为 stripslashes() 不支持 UTF-8。
  • stripslashes 实际上是错误的,感谢 Phil 发现了那个,但删除它并没有帮助。 @Wrikken - 我无法更改原始页面的编码,但运行 mb_convert_encoding($_POST['Name'], 'utf-8', 'ISO-8859-8') 解决了这个问题。谢谢大家的帮助!
  • 啊,是的,在不同的字符集中它还不如是希伯来语,不是很熟悉。 \'s 只是错误消息中的一种表示,向您显示它不是裸字符串xF2xE9xE3,而是字节的十六进制表示。注意顺便说一句:如果您的 整个 站点以ISO-8859-8 工作,则将数据库连接设置为该字符集而不是转换单个输入可能更明智:SET NAMES 'hebrew'; 将在此处执行此操作。在 MySQL 中运行 SHOW CHARACTER SET; 以查看是否有可用的。

标签: php mysql character-encoding


【解决方案1】:

标记已解决,我找到了解决方案。

是的。

[mysqld] character-set-server = utf8 应该改为 latin1

重启mysql

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 2012-08-30
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2017-06-14
    相关资源
    最近更新 更多