char(2)或enum或tinyint

wixjitnu  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(328)

我在数据库中存储countrycode,在countrycode“eg,ae,bh,qa,kw”列中只有5个选项可以存储。我应该使用char(2)或tinyint或enum('eg','ae','bh','qa','kw')吗?为什么?

guicsvcw

guicsvcw1#

使用两个字母的标准国家/地区代码。
并且成功了 CHAR(2) CHARACTER SET ascii . 以及ascii\u bin(不允许大小写折叠)和ascii\u general\u ci(用于大小写折叠)之间的争论。
那就是2个字节。 ENUM 以及 TINYINT UNSIGNED 可能只有一个字节,但国家总数危险地接近256个。在这一点上,您将需要一个2字节 ENUM 或者 SMALLINT .
赞成 CHAR(2) :它是人类可读的(大部分)。而且,如果您需要关于每个国家的更多信息(全名、人口等),您仍然可以有一个带有 PRIMARY KEY(country_code) 而且容易(而且有效) JOIN 需要时。
你的5个ccs列表太长,太可能改变;不要使用 ENUM .
一般来说, ENUM 应该限制在不太可能改变的非常短的列表中。另外,考虑从以下内容开始 'unknown' 而不是进入战场 NULLable .

nr9pn0ug

nr9pn0ug2#

如果你很确定接受值的列表不会增加太多,我会使用枚举来获得更干净的值,避免像'bh''例如'kw'之类的错误输入。

yb3bgrhw

yb3bgrhw3#

ENUM s很好,但在保养方面也有缺点:
列出允许的值需要访问表的定义
向列表中添加新的可能值需要修改表的结构
如果多个表有 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 ,等等。

相关问题