在 MySQL 中使用拉丁字符集存储电子邮件和域名

Posted

技术标签:

【中文标题】在 MySQL 中使用拉丁字符集存储电子邮件和域名【英文标题】:Using latin character sets for storing emails and domain names in MySQL 【发布时间】:2018-01-23 00:56:30 【问题描述】:

关于 *** 的一般建议是在 mysql 中的任何地方都使用 utf8 或 utf8mb4,即使对于只包含拉丁字符的字段也是如此。

What is the best character set for email field? best character set and collation for storing Tags, and URLs in MySQL DB

为了澄清,对于仅包含拉丁字符的列,将使用 utf8mb4:

    ...导致更大的索引和更高的内存使用? ...使用列类型 varchar(100) 或 char(100) 时使用更多存储空间? ...允许在列类型 varchar(100) 或 char(100) 中存储超过 100 个字符?

【问题讨论】:

【参考方案1】:

现在是 2017 年。对每个通用“字符串”字段使用 utf8mb4VARCHAR(255),除非您有非常令人信服的理由不这样做。即使是纯英语的人也喜欢在“¯\_(ツ)_/¯”和“ᕕ(ᐛ)ᕗ”甚至?等情况下使用古怪的非拉丁字符。

电子邮件地址可以在域组件和@ 之前的本地部分中包含非ASCII 字符。这些事情的任何规则似乎都被一一抛到了窗外,所以所有的赌注都是为了未来的发展。希望@ 留下来,这是我唯一可以指望的。

除非您的系统在内存中处理数十亿个电子邮件地址,否则VARCHAR 的存储成本在很大程度上是无关紧要的。请记住,VARCHAR(100)VARCHAR(255) 为 50 个字符的字符串占用完全相同的空间量。长度为 100 的字段的唯一作用就是当某人的电子邮件地址“太长”并被任意修剪时会让人感到紧张。

此外,VARCHAR字符 而非 字节 为单位测量长度,这种差异仅在涉及多字节字符时才相关。 bob@example.com 在 Latin-1、UTF-8 和 UTF8MB4 中占用相同数量的空间。

不要将CHAR 用于可变长度字符字段。 1980年代已经死去。放手吧。

【讨论】:

当您说电子邮件地址可以包含非 ASCII 时,我相信那些需要在验证之前进行 punyencoded 最终使它们成为 ASCII。虽然我同意存储成本在很大程度上无关紧要,但考虑到在 VM 中运行的 db 可用的少量 RAM,索引/内存成本仍然相关。 定义“小”?即使是现在最简陋的 VPS 设备也配备了 512MB 的内存,我已经在这个空间上运行了很多东西而没有任何麻烦。这主要是调整您的数据库服务器以使用适当数量的内存而不是过于激进地进行交换。在事物的方案中,与电子邮件地址相关的内存和存储是您最不担心的。您更关心的是如何管理应用程序代码的日志、指标和内存占用。 一般情况下,最好存储您所获得的电子邮件地址,并让电子邮件传递过程确定如何发送它。自己进行编码并非易事,Punycoding 只是解决方案的一半,本地部分使用完全不同的编码方法。如果您担心内存,Punycoding 的方向是错误的,它比等效的 UTF-8 表示要大得多。

以上是关于在 MySQL 中使用拉丁字符集存储电子邮件和域名的主要内容,如果未能解决你的问题,请参考以下文章

在 WP7 上通过 Linq 2 SQL 存储拉丁字符

如何使用 Node 从 MySQL 读取非拉丁字符?

MySQL性能优化2---数据类型和实例的优化

无法更改 MySQL 5.7 中的字符集(从拉丁语到 utf8)

如何在 MySQL 中处理非拉丁字符(即 С крыш наших домов)?

mysql字符集乱码