理解MYSQL中的DECODE和ENCODE

时间:2015-11-28 18:39:18

标签: mysql decode encode

我需要以这样一种方式保存id,使其加密,这样才能占用8个字符。 我使用以下命令做到了:

SELECT encode(LPAD(id,4,0),'abc')

此命令将变为id = 1 进入0001然后将其变成代码fe5ab21a

如何解密此代码?

以下是选择及其生成结果的示例

SELECT 0001
, DECODE(ENCODE('0001', 'abc'), 'abc')
, UNHEX(DECODE(ENCODE('0001', 'abc'), 'abc'))
, ENCODE('0001','abc')
, DECODE('fe5ab21a', 'abc')
, UNHEX(DECODE('fe5ab21a', 'abc'))
, HEX('0001')

结果:

1
30303031
0001
fe5ab21a
68d357a7005dcbe0
NULL
30303031

1 个答案:

答案 0 :(得分:1)

据我了解,您希望将其作为与您的某个ID相关联的简短唯一密钥传递。

请注意这种加密方式,如果有人想要破解它,它会花费不到几分钟的时间,而且非常弱。但是如果它&#39 ;只有在没有安全风险的情况下进行某些混淆,这没关系。

要提高安全性(但会降低用户体验),请尝试使用AES_ENCRYPT()

您的代码的错误在于您不会强制输入/输出类型,这是正确输入的内容。

SQL Fiddle

MySQL 5.6架构设置

CREATE TABLE t
    (`id` int, `name` varchar(7))
;

INSERT INTO t
    (`id`, `name`)
VALUES
    (1, 'hello'),
    (2, 'hola'),
    (3, 'bonjour')
;

查询1

select *, ENCODE(id,'KEY') as encrypted_id from t

<强> Results

| id |    name | encrypted_id |
|----|---------|--------------|
|  1 |   hello |         Vw== |
|  2 |    hola |         yw== |
|  3 | bonjour |         iA== |

查询2

SELECT * from t where id = CAST(DECODE(FROM_BASE64('yw=='),'KEY') AS CHAR(50))

<强> Results

| id | name |
|----|------|
|  2 | hola |