我遇到的情况是我需要更新名为“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中进行测试,以防万一与它有关...
答案 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
问题,但编码问题是您的源编辑器/语言/其他。