Mysql: Общая ошибка: 1366 Неверное строковое значение

Сегодня у меня возникла ошибка, когда я разрабатывал приложение, основанное на PHP, MySql и Zend Framework. Более того, я использую phpseclib для шифрования данных с использованием алгоритма AES, и вот и возникла проблема. Результат алгоритма AES находится в форме, которая кажется MySql не нравится. Infact, когда я пытаюсь вставить данные в базу данных, получил Sql Exception. Ошибка:

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

Я уже прочитал все ответы, размещенные в Stackoverflow, а также проблему Googled, но все предлагаемое решение уже было в моем коде. База данных, таблицы и все cols имеют Collation 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); 

шифровать ()

 public static function encrypt($Data, $EncryptionKey) { $AES = new Crypt_AES(); $AES->setKey($EncryptionKey); return $AES->encrypt($Data); } - 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; 

Вопрос: Как я могу решить проблему и сохранить данные в базе данных?

Я понимаю, что это ссылка для AES_ENCRYPT для MySQL, однако похоже, что вам может понадобиться изменить varchar(200) на varbinary(200) (или больше), поскольку AES, похоже, возвращает двоичную строку.

На сайте MySQL есть менее четкое объяснение .

Многие функции шифрования и сжатия возвращают строки, для которых результат может содержать произвольные байтовые значения. Если вы хотите сохранить эти результаты, используйте столбец с двоичным строковым типом данных VARBINARY или BLOB. Это позволит избежать возможных проблем с удалением конечного пространства или преобразованием набора символов, которое изменило бы значения данных, например, если вы используете недвоичный строковый тип данных (CHAR, VARCHAR, TEXT).