2011-04-13 75 views
3

是否可以將MySQL AES_ENCRYPT存儲到LONGTEXT列中?mysql aes_encrypt到longtext列

我知道我是假設使用varbinary或blob,但我有一個表,我存儲了一堆隨機「設置」,並且settings_value列是longtext。

我去存儲一個「smtp郵件密碼」在那裏,並有一點卡住。

如果不是,我想我會通過php將它存儲爲十六進制字符串。

SOLUTION:

我的查詢是這樣的:

INSERT INTO table (setting_value)VALUES(AES_ENCRYPT('password', 'key')) ON DUPLICATE KEY UPDATE setting_value=VALUES(setting_value) 

正如您將在下面我的意見看,我試圖從utf8_unicode_ci改變我的專欄編碼utf8_bin,仍然失敗了。我改成了latin1_bin,它工作。

我切換回utf8_unicode_ci和改變了我的查詢到以下幾點:

INSERT INTO table (setting_value)VALUES(HEX(AES_ENCRYPT('password', 'key'))) ON DUPLICATE KEY UPDATE setting_value=VALUES(setting_value) 

,由於它只是把我的值轉換成十六進制字符串工作。

我花了第二弄清楚如何獲得值回了正常,所以對於文檔目的:

$pass = SELECT AES_DECRYPT(BINARY(UNHEX(setting_value)), 'key') as orig_text FROM table 
echo $pass->orig_text 

回答

2

你嘗試了嗎?這是很容易建立一個測試用例,並從我可以看到它正常工作對你的要求:

mysql> create table t (id int unsigned not null auto_increment primary key, str LONGTEXT); 
Query OK, 0 rows affected (0.13 sec) 

mysql> desc t; 
+-------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+-------+------------------+------+-----+---------+----------------+ 
| id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| str | longtext   | YES |  | NULL |    | 
+-------+------------------+------+-----+---------+----------------+ 
2 rows in set (0.05 sec) 

mysql> 
mysql> INSERT INTO t VALUES (1,AES_ENCRYPT('text','password')); 
Query OK, 1 row affected (0.02 sec) 

mysql> 
mysql> select id,str,AES_DECRYPT(str,'password') from t; 
+----+-----------------------------+-----------------------------+ 
| id | str       | AES_DECRYPT(str,'password') | 
+----+-----------------------------+-----------------------------+ 
| 1 | ö½¨Ü·øÍJ/ª¼Tf€D   | text      | 
+----+-----------------------------+-----------------------------+ 
1 row in set (0.00 sec) 
+0

是的,我做了,我不斷收到錯誤:錯誤的字符串值:'\ xA9] \ x84 \ x19 \ x90 \ x19 ...'列'setting_value'。那麼,我會再試一次。我剛看過手冊,它說varbinary或blob。 – 2011-04-13 20:15:20

+0

它在MySQL 5.5.8中爲我工作。我嘗試使用utf8和latin1的字符集,都工作。祝你好運! – 2011-04-13 20:19:44

+0

嗯,將列類型從utf8_unicode_ci更改爲latin1_bin,並找到它。去搞清楚。雖然utf8_bin沒有工作。 – 2011-04-13 20:31:28

0

使用一些二進制列類型(如BLOB,而不是LONGTEXT),用於存儲AES_ENCRYPTed內容。