问题描述
选项 1 表可以将语言 ISO 639-3 代码存储为列:varchar(3) 语言
选项 2 表可以将语言的 ID 存储为一列:int(2?) language_id,并且可以有一个带有 ISO 639-3 代码的语言表。
问题 规模化速度的意义何在?选项 1 在数据库中更容易阅读。如果速度相同或即使在规模上也完全可以忽略不计,我更喜欢它。
谢谢!
解决方法
我推荐:
CREATE TABLE ...
ISO_630_3 CHAR(3) CHARACTER SET ascii
这将是 3 个字节,小于 INT
(4 个字节)and not much bigger than
SMALLINT UNSIGNED`(2 个字节)。
(我说代码总是 3 个 ascii 字母是否正确?因此不需要 VAR
,它需要一两个额外的字节。)
CHAR(3)
很容易索引。即使对 smallint 进行“标准化”也没有明显的优势。即使在 10 亿行的规模下,这仍然适用。
而且,正如您所指出的,“更容易阅读”是值得的。
如果您还存储文本,我假设所有此类文本都可以映射到 UTF-8?如果是这样,请使用
my_text TEXT CHARACTER SET utf8mb4
在 MySQL 中,使用不同的字符集(或排序规则)在单个表中具有不同的列是没有问题的。
也许值得注意...从十六进制 utf-8 编码中可以发现许多语言:
⚈ Cxyy -- More Western Europe: Latin (C3-CA),Combining Diacritical Marks (CC-CD),Greek (CE-CF)
⚈ Dxyy -- Cyrillic (D0-D4),Hebrew (D6-D7),Arabic/Persian/Farsi (D8-DB),etc
⚈ E0yyyy -- various Indian character sets,southern Asia,etc.
⚈ E1yyyy -- Cherokee,Balinese,Khmer,Mongolian,Vietnamese,etc.
(etc)
-- http://mysql.rjweb.org/doc.php/charcoll#diagnosing_charset_issues