You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL更新AES加密的blob类型字段为小写时返回null问题求解

问题原因及解决方案

你编写的SQL存在核心逻辑错误:更新email字段时直接对加密后的blob二进制数据执行lower()操作,而非先解密得到明文邮箱再转小写,这必然会导致数据异常,同时匹配条件也可能存在字符集隐式转换问题。

具体修复步骤

1. 修正更新逻辑

更新email的正确流程是:先解密原始email字段得到明文 → 明文转小写 → 重新AES加密后写入字段。

2. 修正字符集显式转换

cast转换解密结果时需要显式指定字符集(和你建库/表时的字符集一致,通常为utf8mb4),避免隐式转换导致乱码匹配不到"John"的记录。

3. 正确可执行SQL示例

UPDATE lms_systest_db.member_tb
SET email = AES_ENCRYPT(
    LOWER(CAST(AES_DECRYPT(email, '$key') AS CHAR(255) CHARSET utf8mb4)),
    '$key'
)
WHERE CAST(AES_DECRYPT(fname, '$key') AS CHAR(255) CHARSET utf8mb4) = 'John';

额外注意事项

  • 确保$key的值和当初加密email、fname字段时使用的密钥完全一致,包括密钥的编码、长度,否则解密结果会为空。
  • 如果需要批量更新全表所有邮箱为小写,直接去掉WHERE条件即可,执行前建议先备份全表数据避免误操作。
  • 可以先执行SELECT语句验证匹配和解密结果是否正确,确认没问题后再执行UPDATE:
SELECT 
    CAST(AES_DECRYPT(fname, '$key') AS CHAR(255) CHARSET utf8mb4) AS decrypted_fname,
    CAST(AES_DECRYPT(email, '$key') AS CHAR(255) CHARSET utf8mb4) AS original_email,
    LOWER(CAST(AES_DECRYPT(email, '$key') AS CHAR(255) CHARSET utf8mb4)) AS lower_email
FROM lms_systest_db.member_tb
WHERE CAST(AES_DECRYPT(fname, '$key') AS CHAR(255) CHARSET utf8mb4) = 'John';

内容的提问来源于stack exchange,提问作者Prash0604

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:15:04