【问题标题】:MYSQL not recognizing some special charactersMYSQL 无法识别某些特殊字符
【发布时间】:2012-02-09 05:19:04
【问题描述】:

为什么 mysql 不能识别 é 和更多字符,包括破折号 (-) ?这让我发疯了。我不断收到像Incorrect string value: '\xE9' for column这样的错误 我正在使用 mysql 5.5.6 ,我的表是 innodb 并使用排序规则 utf8-default 排序规则。 我不知道这是否重要,但我正在从包含特殊字符的 csv 文件中进行批量插入,并且我的字段类型为 TEXT

【问题讨论】:

  • 您的 csv 文件中是否存在转义问题?还是来自受信任的来源。
  • 刚刚在 utf8-default innodb 表上测试了 é。插入 TEXT 字段时有效。可能是 CSV 中的其他一些非标准字符触发了此错误。
  • 是我从后端上传的。不是用户,所以我绝对是一个值得信赖的来源。
  • 您还应该检查数据库连接的编码类型。
  • 好的。我已经直接对其进行了测试,并且可以正常工作。使用php的mysql api可能是原因吗?我应该使用 mysqli 还是我必须在 PHP 中做些什么。我正在使用 php 脚本运行批量插入

标签: mysql collation


【解决方案1】:

您的问题听起来像我过去处理过的问题,我同意 Synchro 的观点,即客户端连接设置可能是您需要查看的地方。您可能需要在启动连接时指定 UTF8 字符集。

我使用 PDO,并以此启动连接:

$this->dbConn = new PDO("mysql:host=$this->host;dbname=$this->dbname", $this->user, $this->pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

在我开始使用 PDO 之前,我使用过这个:

mysql_query("SET NAMES 'utf8'"); 

http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

【讨论】:

    【解决方案2】:

    我在尝试SELECT ... WHERE table_col LIKE "%–%"(长破折号)时遇到了类似的问题,结果它不起作用,因为我发送查询的 .php 文件不是 UTF8 格式,而是 ANSI 格式!把它转换成 UTF8 就行了!!

    【讨论】:

    • 对我来说,我发现这是因为 csv 文件是 ANSI 而不是 UTF8
    【解决方案3】:

    只需确保 CSV 文件是 UTF8 格式而不是默认的 ANSI 格式。为此,请在记事本中打开 csv 文件并使用另存为选项,确保编码为 UTF8。

    【讨论】:

      【解决方案4】:

      这可能取决于您的 PHP MySQL 客户端的连接设置。 Rob Allen's post 或许能帮你解决。

      而不是使用 PHP 文档明确警告的 SET NAMES utf8 查询,有一个 built-in function 在 mysqli 扩展中为您执行此操作:$mysqli->set_charset('utf8');

      如果您已经这样做了,对坏字符的另一种解释是 MySQL 的 utf8 字符集实际上并不正确 UTF-8... 它只支持最多 3 字节的字符,并且有一些越来越常见的字符集使用 4,特别是表情符号。幸运的是 MySQL 从 5.5.3 版开始对此进行了修复:改用 utf8mb4 字符集。

      在相关说明中,默认 utf8 字符集(使用 utf8_general_ci 排序规则)中的排序顺序存在许多可能会影响您的问题,例如德语。此处的解决方法是使用utf8mb4_unicode_ci 排序规则,它提供了更准确但稍微慢一些的排序规则。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 2020-12-18
        • 1970-01-01
        • 2012-03-28
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        相关资源
        最近更新 更多