MySQL:一般错误:1366 不正确的字符串值

13

今天我在开发一个基于PHP、MySql和Zend Framework的应用程序时遇到了一个错误。此外,我正在使用phpseclib来使用AES算法加密数据,这才出现了问题。AES算法的输出格式似乎不受MySql的喜爱。事实上,当我尝试将数据插入数据库时,我收到了一个Sql异常。错误信息如下:

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

我已经阅读了Stackoverflow上发布的所有答案,并且也在Google上搜索了这个问题,但是所有提出的解决方案都已经在我的代码中。数据库、表和所有列都有校对规则 utf8_general_ci。下面是相关代码:

  1. Application.ini以查看连接设置
  2. Database.php以查看如何检索数据库连接
  3. Model.php以查看如何尝试将数据插入数据库
  4. encrypt()以查看如何使用AES类加密数据
  5. 表定义(如果知道全部都是utf8不足够)

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);

encrypt()

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;

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


相关问题:https://dev59.com/SWs05IYBdhLWcg3wFN8h - hafichuk
1个回答

12
我知道这是有关MySQL中AES_ENCRYPT的参考文献,然而看起来您可能需要将varchar(200)更改为varbinary(200)(或更大),因为AES似乎返回一个二进制字符串。
MySQL网站上有一个不太清晰的解释

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


+1 - 你肯定让我走上了正确的道路。稍后我会尝试加密/解密过程。如果没问题,我会将您的答案标记为正确答案。目前...非常感谢! - Aurelio De Rosa
在这里解决了我的问题 http://stackoverflow.com/questions/4882133/serialize-unserialize-database-data 谢谢 - chim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接