Подтвердить что ты не робот

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, но все предлагаемое решение уже было в моем коде. База данных, таблицы и все столбцы имеют Collation utf8_general_ci. Ниже вы можете увидеть соответствующий код:

  • Application.ini, чтобы узнать, как настроено соединение.
  • Database.php, чтобы узнать, как я получаю подключение к базе данных
  • Model.php, чтобы увидеть, как я пытаюсь вставить данные в базу данных
  • encrypt(), чтобы увидеть, как я использую класс AES для шифрования данных
  • Определение таблицы (если известно, что все в 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);
}

Таблица

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;

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

4b9b3361

Ответ 1

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

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

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