在MySQL中存储unicode字节的正确方法是什么?

问题描述

我正在使用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加密数据,加密的数据都应存储在二进制列中。

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

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

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