MariaDB插入AES加密数据报ERROR 1366(22007)错误求助
故障原因
aes_encrypt()加密函数的返回值是原始二进制字节流,不属于合法的文本字符序列。你当前存储加密结果的data字段为varchar文本类型,MariaDB写入时会按照字段配置的字符集(默认多为utf8mb4)校验内容合法性,二进制流中的非法字符序列无法通过校验,就会触发1366编码报错。
解决方法
方案1:修改字段类型为二进制类型(推荐)
直接将字段调整为专门存储二进制数据的类型,跳过字符集校验,不会出现编码问题,也没有额外的编码转换开销:
- 执行改表语句调整字段类型:
ALTER TABLE test MODIFY COLUMN data VARBINARY(250) DEFAULT NULL;
- 改表完成后,原插入语句可直接正常执行:
INSERT INTO test (data) VALUES (aes_encrypt('mydata','key123456'));
- 解密查询直接调用对应函数即可:
SELECT aes_decrypt(data, 'key123456') AS plain_data FROM test;
方案2:转码为文本格式后存入varchar字段
如果因为业务原因不能修改字段类型,可以将加密后的二进制结果转成Base64编码的合法文本再存储,注意解密时要先做Base64解码:
- 插入时转码:
INSERT INTO test (data) VALUES (TO_BASE64(aes_encrypt('mydata','key123456')));
- 查询解密时先解码再解密:
SELECT aes_decrypt(FROM_BASE64(data), 'key123456') AS plain_data FROM test;
注意:禁止直接将原始二进制加密结果写入varchar类型字段,除了触发编码报错外,还可能因为字符集自动转义、长度截断导致加密数据永久损坏,无法解密还原。
内容的提问来源于stack exchange,提问作者Puneet Dixit
相关产品推荐
相关产品推荐

