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

时间:2017-05-14 10:00:23

标签: php mysql pdo utf-8 names

我遇到的情况是我需要更新名为“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中进行测试,以防万一与它有关...

3 个答案:

答案 0 :(得分:0)

`matrículas`

这是cp866-gp2312编码

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

我有不同的编码风格

答案 1 :(得分:0)

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

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

Unicode代码点237(í),当以utf-8编码时,是一个2字节字符,编码为0xC3 0xAD ...但错误显示为0xED ,恰好是字符í的{​​{3}}编码。

由于错误与从脚本而不是外部数据传递的列名相关,因此提示结果是问题 - PHP脚本本身的列名编码不正确,因为字符已保存脚本的设置为ISO-8859-1而不是UTF-8。

答案 2 :(得分:0)

如果您必须在表名中使用重音字母,则必须在客户端中的UTF-8 中对其进行编码。

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