【问题标题】:What is the proper way to store unicode bytes in MySQL?在 MySQL 中存储 unicode 字节的正确方法是什么?
【发布时间】:2020-12-02 14:03:09
【问题描述】:

我正在使用 mysql-connector,我想在 MySQL 数据库中存储一些数据。我使用 PyCrypto 应用 EAS 加密,结果如下所示的字节字符串:

encrypted_data = b'\xd5\x9e\xea \x8d\xc4\xa6P\x93>\xda\x045\xd6\xfa8'

在我的数据库中存储encrypted_data 的最有效方法是什么?

一个想法是将unicode字节转换为十六进制并将其存储为VARCHAR。虽然在那种情况下我需要两倍的存储空间。

另一个想法是在 MySQL 中对其进行加密。虽然因为我还在 python 中使用了其他加密和散列函数,但我更愿意在 python 中完成所有加密工作,这样代码更有条理和可读性。

【问题讨论】:

    标签: python mysql python-3.x mysql-connector


    【解决方案1】:

    无论你是在 Python 还是 MySQL 中加密数据,加密数据都应该存储在二进制列中。

    许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有 VARBINARY 或 BLOB 二进制字符串数据类型的列。这将避免尾随空格删除或字符集转换可能会更改数据值的潜在问题,例如,如果您使用非二进制字符串数据类型(CHAR、VARCHAR、TEXT)可能会发生这种情况。

    少量加密数据应存储为varbinary,这类似于varchar。大量加密数据应存储为blob,这是text 的二进制版本。

    MySQL has encryption and decryption functions,但您仅限于 AES。如果您对 Python 中的加密感到满意,请使用 Python。只需确保将其加密为二进制数据,而不是十六进制,并将其存储在二进制列中。这将是最有效和最安全的。

    【讨论】:

    • 问题是如何将上面提到的 encrypted_data 存储在 MySQL 中。如果我尝试将它插入到 blob 类型的列中,我会收到“错误代码:1064。您的 SQL 语法有错误...”
    • 该问题的答案存在于另一篇文章中:stackoverflow.com/questions/15504246/… 谢谢您的回答。
    猜你喜欢
    • 2015-10-22
    • 1970-01-01
    • 2022-01-22
    • 2011-05-29
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多