【问题标题】:Incorrect string value errors in AES_ENCRYPT/AES_DECRYPTAES_ENCRYPT/AES_DECRYPT 中的错误字符串值错误
【发布时间】:2016-01-31 22:58:13
【问题描述】:

我正在向自己介绍 MYSQL 中的加密功能。

只写了一个简单的 SQL 语句,将加密条目添加到字段中

INSERT INTO test_table (field1) VALUES(aes_encrypt('fieldentry','password'))

执行 SQL 时出现以下错误

错误 1366:不正确的字符串值:'\xC7\xE13\xC4\xF4!...' for column 'field1' at row 1 SQL Statement - CHANGE COLUMN field1 VARCHAR(255) NOT NULL COMMENT ''

现在我读到它可能与 CHARACTER SET 有关,并尝试将其从 utf8-default 排序规则更改为 utf8mb4 - 推荐的默认排序规则,但这没有任何区别。

我还尝试将列类型从 VARCHAR 更改为 VARBINARY。然而,当我尝试以下方法检索数据时,SQL 语句运行成功:

SELECT AES_DECRYPT(field1, '12345') AS endata FROM test_table
    Do Until rst.EOF 
        Response.Write(rst("endata"))
        rst.movenext
    Loop

循环运行但没有返回值(空行)

我只是在寻找一个简单的方法来加密然后使用函数 AES_ENCRYPT/AES_DECRYPT 中的密码解密我的数据。

【问题讨论】:

    标签: mysql sql encryption encoding aes


    【解决方案1】:

    AES_ENCRYPT() encrypts a string and returns a binary string. AES_DECRYPT() 解密加密字符串并返回原始字符串 字符串。

    所以你应该把field1,firstname的类型从VARCHAR(255)改成VARBINARY(255)。它将解决问题..

    编辑:对于类型不匹配..请试试这个..

    SELECT *, 
           CAST(AES_DECRYPT(field1, 'mypassword') AS CHAR(50)) end_data
    FROM   user
    

    希望这会有所帮助..

    【讨论】:

    • 谢谢。 AES_ENCRYPT() 可以很好地存储数据,但是 AES_DECRYPT() 返回类型不匹配。 SELECT id, AES_DECRYPT(field1, 'mypassword') AS enddata FROM test_table Response.Write(rst("endata") & "
      ")
    • 感谢 Subin,完美的解决方案。
    • 如果我的列中已经有数据并且我想更新该列以用它们的加密替换数据怎么办?如果我将列从 VARCHAR 转换为 VARBINARY 原始数据会怎样?
    • 当您将列更改为 blob 或二进制时,@Ahmedn1 整数和 varchars 将转换为字符串。但是,如果您想确定,只需创建一个包含一些数据的表并更改列类型以查看发生了什么。
    猜你喜欢
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多