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