2011-04-13 31 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内容。