【问题标题】:MySQL table name with accent. Invalid utf8 character string when updating via PDO带重音的 MySQL 表名。通过 PDO 更新时无效的 utf8 字符串
【发布时间】:2017-05-14 10:00:23
【问题描述】:

我需要更新名为“matrículas”的表中的一些行。查询看起来像这样:

UPDATE `matrículas` SET...

当我直接在我的 SQL 程序 (HeidiSQL) 中运行此查询时,它可以毫无问题地执行。当我通过 PDO 对象在 PHP 中执行此操作时,出现以下错误:

SQLSTATE[HY000]: General error: 1300 Invalid utf8 character string: 'matr\xEDculas'

我的 PDO 对象是这样设置的:

$db= new PDO(
    'mysql:host='.$credentials['host'].';dbname='.$credentials['dbname'].';charset=utf8',
    $credentials['user'],
    $credentials['password'],
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

实际的更新是通过上面的查询完成的:

$query = $this->db->prepare($sql);
$query->execute($params);

表和数据库都是使用utf8_general_ci 排序规则创建的。

任何想法我做错了什么?顺便说一句,我目前正在 Windows 中进行测试,以防万一与它有关...

【问题讨论】:

  • 你在初始化数据库连接的时候有什么错误吗?也试试看
  • 次要注意:字符集应该放在 DSN 中。
  • @Akintunde 不,没有错误。我实际上在 try/catch 中发现了上面的错误
  • @tereško - 应该进入 DSN 吗?我只是按照php.net/manual/en/mysqlinfo.concepts.charset.php 上的示例进行操作(示例 3)
  • 使用十六进制编辑器检查您的 PHP 脚本。存储在脚本中的表名是matr\xEDculas 还是matr\xC3\xADculas\xNN 代表一个字节的十六进制值)? utf-8 中的代码点 237 (í) 是一个 2 字节字符 0xC3 0xAD,而 0xEDLatin1 编码。编码绝对是问题所在,但谁来修复它,它在哪里被破坏了……这对我来说是模糊的。

标签: php mysql pdo utf-8 names


【解决方案1】:
ERROR 1300 (HY000): Invalid utf8 character string: 'matr\xEDculas'

\xNN 表示法给出字符串中无效字节的十六进制编码值。

Unicode 代码点 237 (í),当以 utf-8 编码时,是一个 2 字节字符,编码为 0xC30xAD... 但错误显示 0xED,恰好是ISO/IEC-8859-1 (Latin1) 字符 í 的编码。

由于错误与从脚本而不是外部数据传递的列名有关,这表明了问题所在 - PHP 脚本本身的列名编码不正确,因为字符保存脚本的设置是 ISO-8859-1 而不是 UTF-8。

【讨论】:

  • tl;dr - 必须将我的 PHP 脚本编码为 UTF-8。 Windows 默认将其保存在 ISO-8859-1 中
【解决方案2】:
`matrículas`

这是cp866-gp2312编码

请将其更改为 utf-8,例如 matriculas

我有不同的编码风格

【讨论】:

  • 问题是,我无法控制表名。我不能改变它,让它没有重音......
  • ED 仅在 cp1250、dec8、latin1、latin2、latin5、macroman 中为 í
【解决方案3】:

如果您必须在表名中使用重音字母,那么它们必须以UTF-8 编码在客户端

也就是说,这不是PDO 的问题,而是编码问题是您的源编辑器/语言/其他问题。

【讨论】:

    猜你喜欢
    • 2017-09-10
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2010-11-21
    • 1970-01-01
    • 2013-11-05
    相关资源
    最近更新 更多