【发布时间】:2020-07-11 20:09:34
【问题描述】:
表中的条目由 5-10 个字符长的单词唯一标识,我使用 TINYTEXT(10) 作为列。但是,当我尝试将其设置为 PRIMARY 键时,我收到 size 丢失的错误。
根据我对文档的有限理解,PRIMARY 键的Size 可用于简化检测唯一值的方法,即当前几个字符(由Size 指定)足以将其视为唯一匹配时。在我的情况下,size 的值从 5 到 10 不等(它们都是 latin1,因此它们是每个字符的精确字节 + 长度为 1)。两个问题:
- 如果我想使用 TINYTEXT 作为主键,我应该指定哪个
size?最大可用 - 在这种情况下为 10?或者应该是sizestrictly EXACT,例如,如果我的密钥是 6 个字符长的单词,但我将Size指定为 PK 为 10 - 它会尝试读取所有 10 个并且会失败给我一个例外? - 使用 [TINY]TEXT 进行 PK 在性能方面会有多糟糕?所有 Google 搜索结果都让我得出“这很糟糕,你被解雇了”的意见和陈述,但考虑到 TINYTEXT 最大为 255 并且我已经将最大长度指定为 10,在这种情况下真的如此吗?
【问题讨论】:
-
您是否有理由认为使用 TINYTEXT 而不是 VARCHAR?
-
@gview 是的,我不需要超过 10 个字符,并且 TINYTEXT 没有填充 255 长。 VARCHAR 有自己的打包问题,因为它长达 65k
-
varchar 只需要使用的存储空间 + 1 个字节的长度。它不像一个字符。如果您声明一个 varchar[10],您最多可以存储 10 个字符,但是如果您只使用 5,那么它只需要 5 + 1 个字节。更糟糕的情况是需要 11 个字节。
-
@gview - 最坏的情况是 41 字节 -- 如果 charset = utf8mb4。
-
使用
VARCHAR,而不是TINYTEXT。并且不要使用前缀。期间。
标签: php mysql database tinytext