2017-06-26 1 views
0

のためにMySQLのZF2 dbAdapterを使用したとき、私は「tableGateway」オブジェクトにレコードを更新しようとしたとき、私は例外を取得しています:UTF-8バート・エンコーディング更新

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を削除しましたカタログは "latin1_swedish_ci"なので、成功しません。

私はこの問題にどのように対処するかについてのヒントをいただける方に感謝します。

ありがとうございます。

+0

こんにちは@Cesar、例外が発生していることを強調できますか?あなたの質問を隠すときは明確ではありません。 – Chic

+0

うまくいけば、あなたはUTF8に向かうことができます。 UTF8を上から下に向けると、多くのエンコーディングの問題を解決できます。 – tadman

+0

私はUTF-8を削除しようとしましたが、文字列 'utf8_decode("Código ")'を変換しますが、列名は 'C \ 'ó\' digo'になります。 –

答えて

0

データベースのエンコードタイプがUTF-8であることを確認してください。

'driver_options' => array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
), 

フィールドがutf8_general_ciであることを確認します。あなたのレイアウトPHTMLヘッドで

はあなたがそう使用して、次のいずれかのコマンドを使用しutf-8にエンコーディングを変更することはできません言ったように

<meta charset='utf-8'> 

を更新したdriver_options

'SET NAMES \'latin1\'' or 'SET CHARACTER SET \'latin1\'' 

詳しくはdocをご覧ください。

latin1の文字

を持っている列名に問題がジャストTableGatewayupdate()メソッドに2番目の引数としてではない文字列として配列を条件に合格。ただし、driver_optionsには'SET NAMES \'UTF8\''を設定する必要があります。

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

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

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

OPが言うように 'driver_option'が設定されています。さらに、私はビューを使用していませんが、出力はコンソール/ cron経由でコントローラにレンダリングされます。最後に、フィールドとカタログはLATIN1であり、私はDBAではないので変更できません。 –

+0

ちょうど編集されたコード!それがあなたのために働くかどうか私達にお知らせください! – unclexo

+0

私はUTF-8を削除しようとしましたが、文字列 'utf8_decode("Código ")'を変換しましたが、列名は 'C \ 'ó\' digo'になります。カラム"。 –

関連する問題