【问题标题】:UTF-8 Bad Encoding when Using ZF2 dbAdapter for mySQL for Update使用 ZF2 dbAdapter for mySQL 进行更新时出现 UTF-8 错误编码
【发布时间】:2017-06-26 16:56:57
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 您好@Cesar,您能强调一下您遇到了异常吗?略读您的问题时不清楚。
  • 希望您可以转向 UTF8 而不是远离。从上到下采用 UTF8 可以解决很多编码问题。
  • 我尝试删除 UTF-8 并转换字符串 utf8_decode("Código"),但列名变为 'C`ó`digo',特殊字符之间有 2 个反引号。

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


【解决方案1】:

确保您的数据库编码类型为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 个字符时出现问题

只需将条件作为字符串而不是数组作为第二个参数传递给TableGatewayupdate() 方法。但是你必须在你的 driver_options 中设置这个'SET NAMES \'UTF8\''

$id = 1;
$where = "Código = {$id}";

// Or use this way
$where = "Código = 1";

$this->tableGateway->update($set, $where); 

【讨论】:

  • “driver_option”已按照 OP 的说明进行设置。此外,我没有使用视图,而是通过控制台/cron 将输出呈现给控制器。最后,字段和目录是 LATIN1,因为我不是 DBA,所以无法更改。
  • 我尝试删除 UTF-8 并转换字符串 utf8_decode("Código"),但列名变为 'C`ó`digo',特殊字符之间有 2 个反引号,结果为“UNKNOWN列”。
  • 最后我可以使用纯字符串“Código = {$id}”来解决,然后我支持你并标记为已解决。谢谢。
猜你喜欢
  • 2017-11-08
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多