2011-11-28 105 views
11

今天我在開發基於PHP,MySql和Zend Framework的應用程序時出錯。此外,我正在使用phpseclib來加密數據,使用AES algorithm,這裏出現了問題。 AES算法的輸出是MySql不喜歡的形式。事實上,當我嘗試將數據插入數據庫時​​,得到了一個Sql異常。錯誤是:Mysql:常規錯誤:1366錯誤的字符串值

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

我已經讀過發佈#2的所有答案,也用Google搜索這個問題,但所有提出的解決方案在我的代碼裏了。數據庫,表格和所有列都有排序規則utf8_general_ci。下面你可以看到相關的代碼:

  1. 的application.ini來看看如何設置連接
  2. database.php中,看我怎麼檢索數據庫連接
  3. Model.php,看我如何努力在數據庫中插入數據
  4. 加密(),看我如何使用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); 
} 

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; 

問:我怎樣才能解決這個問題並且將數據存儲到數據庫中?

+0

相關的問題http://stackoverflow.com/questions/7461962/mysql-how-to-store-aes-encrypted-data – hafichuk

回答

9

我意識到,這是AES_ENCRYPT爲MySQL一個reference,但它看起來像你可能需要改變你的varchar(200)varbinary(200)(或更大)作爲AES似乎返回一個二進制字符串。

MySQL網站上有一個不太清晰的explanation

Many encryption and compression functions return strings for which the result might contain arbitrary byte values. If you want to store these results, use a column with a VARBINARY or BLOB binary string data type. This will avoid potential problems with trailing space removal or character set conversion that would change data values, such as may occur if you use a nonbinary string data type (CHAR, VARCHAR, TEXT).

+0

+1 - 你肯定把我在正確的道路。稍後我會嘗試加密/解密過程。如果可以,我會檢查你的答案。目前...很多謝謝你! –

+0

np,感謝張貼這個 - 自學了一些新東西。 – hafichuk

+0

它很好用。許多人再次感謝你! –

相關問題