MySQL table 带有重音的名字。通过 PDO 更新时无效的 utf8 字符串

MySQL table name with accent. Invalid utf8 character string when updating via PDO

我现在需要更新 table 中名为“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);

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

知道我做错了什么吗?顺便说一句,我目前正在 Windows 进行测试,以防与它有关...

`matrículas`

这是cp866-gp2312编码

matriculas

请改成utf-8

我有不同的编码风格

ERROR 1300 (HY000): Invalid utf8 character string: 'matr\xEDculas'

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

Unicode code point 237 (í),当用utf-8编码时,是一个2字节的字符,编码为0xC3 0xAD...但是错误显示0xED,恰好是字符 í.

ISO/IEC-8859-1 (Latin1) 编码

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

如果您必须在 table 名称中使用重音字母,则它们必须在客户端 UTF-8 中编码 .

也就是说,这不是 PDO 问题,而是编码问题是您的来源 editor/language/whatever。