mysql InnoDB中加密的电子邮件应该有什么类型和大小?

mysql InnoDB中加密的电子邮件应该有什么类型和大小?,mysql,encryption,innodb,Mysql,Encryption,Innodb,我的数据库中有一个电子邮件属性。我将它存储在TINYTEXT中。但现在我决定用AES加密它,并将其加密存储。我应该使用什么类型和大小的电子邮件来避免任何问题 根据文档,我决定将电子邮件存储为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

我的数据库中有一个电子邮件属性。我将它存储在
TINYTEXT
中。但现在我决定用AES加密它,并将其加密存储。我应该使用什么类型和大小的电子邮件来避免任何问题

根据文档,我决定将电子邮件存储为
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)

我说的对吗?

简单的答案是:
VARBINARY(48)
,正如你计算的那样。但是,要处理更长的电子邮件地址,
BLOB

梅西耶回答

AES_ENCRYPT
对字符串进行一些扩展,因此加密后254将超过255。此外,它还返回非字符字节

BLOB
是一个简单的答案
VARBINARY(256)
可能也可以工作,但可能没有任何优势。(我怀疑utf8字符可能会使其超过256个。)

你需要索引它吗?这可能导致其他问题


如果您将电子邮件限制为32个ascii字符,您将排除或截断多少个字符?

简单回答:
VARBINARY(48)
,如您所计算。但是,要处理更长的电子邮件地址,
BLOB

梅西耶回答

AES_ENCRYPT
对字符串进行一些扩展,因此加密后254将超过255。此外,它还返回非字符字节

BLOB
是一个简单的答案
VARBINARY(256)
可能也可以工作,但可能没有任何优势。(我怀疑utf8字符可能会使其超过256个。)

你需要索引它吗?这可能导致其他问题


如果您将电子邮件限制为32个ascii字符,您将排除或截断多少个字符?

正如名称所示,VARCHAR的长度基于数据中的字符数。VARBINARY列的长度基于值中的字节数(八位字节)。如果不参考用于数据的字符集,则无法计算列的适当大小

尝试将VARBINARY数据存储在不够长的列中会导致错误,而不是数据被截断,因此您需要考虑可能的最长值以及字符集可能允许多字节字符的事实。最简单的方法是查询information\u schema.columns表,从
CHARACTER\u OCTET\u LENGTH
(而不是
CHARACTER\u MAXIMUM\u LENGTH
)获取当前大小,然后将公式应用于该值

e、 g


你不需要再多加一点来处理填充,因为在你的公式中已经考虑到了

正如名称所示,VARCHAR的长度基于数据中的字符数。VARBINARY列的长度基于值中的字节数(八位字节)。如果不参考用于数据的字符集,则无法计算列的适当大小

尝试将VARBINARY数据存储在不够长的列中会导致错误,而不是数据被截断,因此您需要考虑可能的最长值以及字符集可能允许多字节字符的事实。最简单的方法是查询information\u schema.columns表,从
CHARACTER\u OCTET\u LENGTH
(而不是
CHARACTER\u MAXIMUM\u LENGTH
)获取当前大小,然后将公式应用于该值

e、 g


你不需要再多加一点来处理填充,因为在你的公式中已经考虑到了

我通常只存储长度为80的VARCHAR(我见过一些很长的电子邮件地址,哈哈)电子邮件地址。我通常只存储长度为80的VARCHAR(我见过一些很长的电子邮件地址,哈哈)电子邮件地址。
SELECT 16 * (FLOOR(CHARACTER_OCTET_LENGTH / 16) + 1)
FROM information_schema.columns
WHERE TABLE_SCHEMA = 'yrdb'
AND TABLE_NAME = 'yrtable'
AND COLUMN_NAME = 'email'