使用ZF2 dbAdapter for mySQL for Update时的UTF-8错误编码

时间:2017-06-26 16:56:58

标签: mysql pdo encoding utf-8 zend-framework2

当我尝试使用“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”而没有成功。

如果有人提醒我如何面对这个问题,我将不胜感激。

提前致谢。

1 个答案:

答案 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\''