对于我当前正在构建的应用程序,我需要一个数据库来存储书籍。 books 表的架构应包含以下属性:
id, isbn10, isbn13, title, summary
ISBN10 和 ISBN13 应该使用什么数据类型?我的第一个想法是大整数,但我读过一些未经证实的评论,说我应该使用 varchar。
您需要一个
CHAR
/VARCHAR
(CHAR
可能是最好的选择,因为您知道长度 - 10 和 13 个字符)。 INTEGER
等数字类型将删除 0-684-84328-5
等 ISBN 中的前导零。
ISBN 数字应存储为字符串,例如
varchar(17)
。
ISBN13 需要 17 个字符,13 个数字加连字符;ISBN10 需要 13 个字符,10 个数字加连字符。
ISBN10 数字虽然称为“数字”,但可能包含字母 X。ISBN 数字中的最后一个数字是范围从 0 到 10 的校验位,10 表示为 X。另外,它们可能以双数开头
0
,例如 0062472100
,并且作为数字格式,它可能会在存储后删除前导 00
。
84-7844-453-X 是有效的 ISBN10 编号,其中 84 表示西班牙,7844 是出版商编号,453 是书号,X(即 10)是控制数字。如果我们删除连字符,我们就会将出版商与图书 ID 混合在一起。这真的很重要吗?根据您将给予该号码的用途。书目研究人员(我发现自己处于这种情况)可能需要它的原因有很多,我不会在这里讨论,因为它与存储数据无关。我建议不要删除连字符,但事实是每个人都会这样做。
ISBN13 在含义方面面临着同样的问题,因为使用连字符你会得到 4 个有意义的数据块,没有它们,语言、出版商和图书 ID 将丢失。
尽管如此,控制数字只会是0-9,永远不会有字母。但是,如果您想只存储 isbn13 号码(因为 ISBN10 可以自动升级到 ISBN13),并使用
int
,那么您将来可能会遇到一些问题。所有 ISBN13 编号均以 978 或 979 开头,但将来可能会添加一些 078。
我想为 BIGINT 做一个例子,在存储之前将 ISBN-10(其中有 1/11 次的非数字校验位)转换为 ISBN-13。
这将占用 8 个字节,而 ISBN-10 将占用 10 个字节,ISBN-13 将占用 13 个字节。使用典型的字边界填充,任一 ISBN 可能最终会占用 16 个字节。
内存要求并不是非常重要,但使用 CHAR 字段可能会带来明显的速度损失。
现代架构可以通过一次额外的内存获取直接处理 BIGINT 数学。这意味着搜索和排序将会更快。在该列上放置索引,速度会更快。事实上,我使用 ISBN-13 作为我的 MariaDB Library 数据库的主键。
当我将其从 CHAR 更改为 BIGINT 时,我注意到性能提高了约 20%。
正确的 ISBN-13 的另一个好处是您不必担心前导零填充。我什至找到了一些 SQL 代码来验证 ISBN-13 校验位。