加密电子邮件在mysql InnoDB中应该具有哪种类型和大小?

时间:2018-03-19 09:54:35

标签: mysql encryption innodb

我的数据库中有一个电子邮件属性。我将其存储在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)

我是对的吗?

2 个答案:

答案 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'  

然后,您不需要额外添加一些额外费用来处理填充,因为已经在您的公式中考虑了这一点。