【发布时间】: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 字节字符0xC30xAD,而0xED是 Latin1 编码。编码绝对是问题所在,但谁来修复它,它在哪里被破坏了……这对我来说是模糊的。