我发现了类似的问题,但对这个问题没有明确的答案。我有这张桌子:
CREATE DATABASE testDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE testTable
(
firstName binary(32) not null,
lastName binary(32) not null
/* Other non-binary fields omitted */
)
engine=INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
这句话执行得很好:
INSERT INTO testTable (firstName) VALUES (AES_ENCRYPT('Testname', 'test'));
但是,这会返回NULL:
SELECT AES_DECRYPT(firstName, 'test') FROM testTable;
为什么返回NULL?
Fwiw,这会按预期返回“testValue”:
SELECT AES_DECRYPT(AES_ENCRYPT('testValue','thekey'), 'thekey');
答案 0 :(得分:9)
答案是列应为binary
时应为varbinary
。 This article解释道:
因为如果AES_DECRYPT()检测到无效数据或不正确 填充,它将返回NULL。
如果binary
列类型为固定长度,则必须知道输入值的长度以确保填充正确。对于未知长度值,请使用varbinary
以避免由于值长度不同而导致填充不正确。
答案 1 :(得分:0)
当您将二进制数据插入VARCHAR字段时,VARCHAR无法处理一些二进制字符,并且它们会插入插入的值中。然后,当您检索插入的值时,插入的值将不相同。 1.选择十六进制(aes_encrypt(file,'key')); 2.选择aes_decrypt(unhex(文件),'key');
答案 2 :(得分:0)
检查字段的类型是否为blob而不是二进制(32)
答案 3 :(得分:-1)
除了' Testname'?之外,你有没有尝试过不同的值? 其他价值观是否有效?
我问,因为我在测试2个测试信用卡号码时有一个情况,其中一个解密罚款,另一个返回空。
答案是按照" abhinai raj"
的建议给hex和unhex