当我尝试使用“tableGateway”对象更新记录时,我收到了异常:
Zend\Db\Adapter\Exception\InvalidQueryException
Statement could not be executed
(HY000 - 1300 - Invalid utf8 character string: 'C`\xC3`\xB3`digo')
我在mySQL中有以下数据表结构:
CREATE TABLE `clientes` (
`Código` int,
`Nome` varchar(50),
`Descricao` varchar(150)
....
);
INSERT INTO `clientes` (`Código`, `Nome`, `Descricao`)
VALUES (1, 'Test Nome', 'Test Descricao');
数据库编码为'latin1',但数据库配置如下所示:
'mycnn' => array(
'driver' => 'pdo',
'dsn' => 'mysql:dbname={$mydb};host={$myhost}',
'username' => '{$myuser}',
'password' => '{$mypassword}',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
)
正如您所看到的,我已经设置了“UTF-8”的驱动程序,列名“Código”具有特殊字符,并且不能重命名此列。
我在模型中用于更新的语法是:
$set = array("Nome" => "Edited Test");
$where = array("Código" => 1);
$this->tableGateway->update($set, $where);
之后,ZF正在解析抛出异常的SQL:
UPDATE "clientes" SET "Nome" = 'Edited Test' WHERE "C`\xC3`\xB3`digo" = 1
我还删除了UTF-8选项,因为目录是“latin1_swedish_ci”而没有成功。
如果有人提醒我如何面对这个问题,我将不胜感激。
提前致谢。
答案 0 :(得分:0)
确保您的数据库编码类型为UTF-8
。
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
确保字段为utf8_general_ci
。
在你的布局中,phtml头有
<meta charset='utf-8'>
<强>更新强>
正如您所说,您无法将编码更改为utf-8
,因此请使用driver_options
'SET NAMES \'latin1\'' or 'SET CHARACTER SET \'latin1\''
有关详细信息,请查看doc!
当列名具有latin1字符
时出现问题将条件作为字符串而非数组作为第二个参数传递到TableGateway
的{{1}}方法。但是您必须在driver_options中设置此update()
。
'SET NAMES \'UTF8\''