Mysql:常规错误:1366字符串值不正确

时间:2011-11-28 03:24:05

标签: php mysql zend-framework

今天我在开发基于PHP,MySql和Zend Framework的应用程序时遇到了错误。此外,我正在使用phpseclib使用AES algorithm加密数据,这就出现了问题。 AES算法的输出形式似乎是MySql不喜欢的形式。事实上,当我尝试将数据插入数据库时​​,得到了一个Sql异常。错误是:

SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE4\xD5\xABtZM...' for column 'Name'

我已经阅读了Stackoverflow上发布的所有答案,并且还搜索了问题,但所有提议的解决方案都已在我的代码中。数据库,表格和所有列都具有排序utf8_general_ci。您可以在下面看到相关代码:

  1. Application.ini,了解如何设置连接
  2. Database.php以查看我如何检索数据库连接
  3. Model.php,了解我如何尝试在数据库中插入数据
  4. encrypt()以查看我如何使用AES类加密数据
  5. 表定义(如果知道所有都在utf8中是不够的)
  6. 的application.ini

    resources.db.adapter = "Pdo_Mysql"
    resources.db.params.charset = "utf8"
    resources.db.params.host = "localhost"
    resources.db.params.username = "********"
    resources.db.params.password = "********"
    resources.db.params.dbname = "dbname"
    

    database.php中

    public static function getDb()
    {
       if (self::$Db === NULL)
          self::$Db = Zend_Db_Table::getDefaultAdapter();
       return self::$Db;
    }
    

    model.php

    $Values = array(
       'Id' => $this->Id,
       'Name' => $this->Name,
       'CreationDate' => $this->CreationDate,
    );
    $RowChanged = $Db->insert('TABLENAME', $Values);
    

    加密()

    public static function encrypt($Data, $EncryptionKey)
    {
       $AES = new Crypt_AES();
       $AES->setKey($EncryptionKey);
       return $AES->encrypt($Data);
    }
    

    表格

    CREATE TABLE IF NOT EXISTS `table` (
      `Id` mediumint(8) unsigned NOT NULL,
      `Name` varchar(200) DEFAULT NULL,
      `CreationDate` date NOT NULL,
      PRIMARY KEY (`Id`),
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    问题:如何解决问题并将数据存储到数据库中?

1 个答案:

答案 0 :(得分:11)

我意识到这是针对MySQL的AES_ENCRYPT的reference,但是看起来您可能需要将varchar(200)更改为varbinary(200)(或更大),因为AES似乎已返回二进制字符串。

MySQL网站上有一个不太清楚的explanation

  

许多加密和压缩函数返回的字符串   结果可能包含任意字节值。如果你想存储这些   结果,使用带有VARBINARY或BLOB二进制字符串数据的列   类型。这将避免尾随空间移除的潜在问题   或者可以改变数据值的字符集转换   如果使用非二进制字符串数据类型(CHAR,VARCHAR,TEXT),则会出现。