[英]char(2) or enum or tinyint in MySQL
我将 CountryCode 存储在我的数据库中,我只有 5 个选项可以存储在 CountryCode "EG, AE, BH, QA, KW" 列中我应该使用 char(2) 还是 tinyint 或 enum('EG', 'AE', ' BH','QA','KW')为什么?
如果你很确定接受值的列表不会增加太多,我会用枚举 go 来获得更干净的值,避免像'Bh''eg''kW'之类的错误输入。
使用 2 个字母的标准国家/地区代码。
并将其CHAR(2) CHARACTER SET ascii
。 以及 ascii_bin (不允许大小写折叠)和 ascii_general_ci (用于大小写折叠)之间的争论。
那将是2个字节。
ENUM
和TINYINT UNSIGNED
将只有一个字节,但国家的总数危险地接近 256。此时您将需要一个 2 字节的ENUM
或SMALLINT
。
支持CHAR(2)
的一个论点:它是人类可读的(大部分)。 而且,如果您需要有关每个国家/地区的更多信息(全名、人口等),您仍然可以拥有一张带有PRIMARY KEY(country_code)
的表,并在需要时轻松(有效地) JOIN
。
您的 5 cc 清单太长,太可能更改; 不要使用ENUM
。
一般来说, ENUM
应该限制在不太可能改变的非常短的列表中。 此外,请考虑使用类似'unknown'
的内容开始列表,而不是使字段NULLable
。
ENUM
很好,但在维护方面有缺点:
列出允许的值需要访问表的定义
向列表中添加新的可能值需要修改表的结构
如果多个表有CountryCode
列,则需要重新创建另一个ENUM
所以这应该只在列表不打算随时间改变的情况下使用,并且单个列使用它。
在所有其他情况下,拥有一个存储值的引用表并在引用表中创建外键会更简单:
-- referential table
create table countries (countryCode varchar(2) primary key);
insert into countries values ('EG'), ('AE'), ('BH'), ('KW');
-- referencing table
create table mytable (
id int, -- and/or other columns of the table ...
countryCode varchar(2) references countries(countryCode)
);
使用这种技术,您可以获得外键的全部好处和灵活性:易于维护、数据完整性、可能的索引、不错的选项(例如on delete cascade
等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.