我的数据库中有一个电子邮件属性。我将其存储在TINYTEXT
中。但现在我决定使用AES_ENCRYPT
加密它并将其加密存储。我应该采用什么类型和尺寸的电子邮件来避免任何问题?
从QProcess Documentation文档中,我决定将电子邮件存储为VARBINARY(60)
。以下是我的想法:
16 × (trunc(string_length / 16) + 1)
I want my email to be VARCHAR(32)
16 × (trunc(32 / 16) + 1) = 48
But in order to avoid padding problems I will use 60 instead of 48.
So, the type of the encrypted email will be VARBINARY(60)
我是对的吗?
答案 0 :(得分:3)
简单回答:VARBINARY(48)
,正如您计算的那样。但是,要处理更长的电子邮件地址,BLOB
。
梅西耶答案:
AES_ENCRYPT
将字符串扩展为一些,因此加密后254将超过255。此外,它返回非字符字节。
BLOB
是一个简单的答案。 VARBINARY(256)
可能也有效,但可能没有任何优势。 (我怀疑utf8字符可能超过256。)
你需要索引吗?这可能会导致其他问题。
如果您将电子邮件限制为32个ascii字符,您将排除或截断世界的百分比?
答案 1 :(得分:1)
顾名思义,VARCHAR的长度取决于数据中的字符数。 VARBINARY列的长度基于值中的字节数(八位字节)。如果不参考用于数据的字符集,则无法计算列的适当大小。
尝试将VARBINARY数据存储在一个不够长的列中会导致错误而不是截断数据,因此您需要允许尽可能长的值以及您的字符集可能允许多个字节。最简单的方法是查询information_schema.columns表并从CHARACTER_OCTET_LENGTH
(而不是CHARACTER_MAXIMUM_LENGTH
)获取当前大小,然后将公式应用于
e.g。
SELECT 16 * (FLOOR(CHARACTER_OCTET_LENGTH / 16) + 1)
FROM information_schema.columns
WHERE TABLE_SCHEMA = 'yrdb'
AND TABLE_NAME = 'yrtable'
AND COLUMN_NAME = 'email'
然后,您不需要额外添加一些额外费用来处理填充,因为已经在您的公式中考虑了这一点。