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。
我现在需要更新 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
我有不同的编码风格
ERROR 1300 (HY000): Invalid utf8 character string: 'matr\xEDculas'
\xNN
符号给出了字符串中无效字节的十六进制编码值。
Unicode code point 237 (í),当用utf-8编码时,是一个2字节的字符,编码为0xC3
0xAD
...但是错误显示0xED
,恰好是字符 í
.
由于错误与从脚本而不是外部数据传递的列名有关,这表明问题所在——PHP 脚本本身具有列名编码不正确,因为保存脚本的字符集是 ISO-8859-1 而不是 UTF-8。
如果您必须在 table 名称中使用重音字母,则它们必须在客户端 UTF-8
中编码 .
也就是说,这不是 PDO
问题,而是编码问题是您的来源 editor/language/whatever。