是否可以将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
答案 0 :(得分: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)
答案 1 :(得分:0)
使用一些二进制列类型(如BLOB而不是LONGTEXT)来存储AES_ENCRYPTed内容。