mysql varbinary vs varchar

时间:2009-06-10 06:06:25

标签: mysql character collation

我们使用varchar(255)在mysql中存储“关键字”。我们面临一个问题,即mysql忽略所有尾随空格以便在“=”中进行比较。它确实在“like”比较中尊重尾随空格,但是如果它有一个“UNIQUE”索引,它不会让我们在varchar列中存储和不存在尾随空格的相同单词。

所以,我们正在考虑切换到varbinary。当列值中有多字节字符时,有人会建议可能会有什么影响吗?

3 个答案:

答案 0 :(得分:2)

Andomar,

我们使用5.0.5版。所有mysql版本都忽略尾随空格进行比较。从手册:

  

所有MySQL排序规则都是类型   PADSPACE。这意味着所有CHAR和   比较MySQL中的VARCHAR值   不考虑任何尾随空格。   这适用于所有MySQL版本,   它是否没有区别   你的版本修剪尾随空格   来自存储之前的VARCHAR值   它们

此外,mysql认为带有/不带尾随空格的文本在索引中重复:

  

对于那些尾随垫的情况   字符被剥离或比较   如果列具有索引,则忽略它们   这需要唯一的值,插入   进入不同的列值   仅在尾随垫的数量   字符将导致a   重复键错误。例如,如果是   表包含'a',尝试   store'a'会导致重复键   错误。

而且,我们绝对需要关键字索引。 所以,我想我们有两个选择:varbinary或text。我们将评估“text”的性能,以及varbinary的多字节功能。

答案 1 :(得分:0)

这是MySQL manual关于尾随空格的内容:

  

处理尾随空格是   版本依赖性。从MySQL 5.0.3开始,   尾随空格保留时   值存储和检索,在   符合标准SQL。之前   MySQL 5.0.3,尾随空格是   从值中删除   存储在VARCHAR列中;这个   意味着空间也不存在   从检索到的值。

由于你的问题是MySQL没有重复跟踪尾随空格,我认为你的版本低于5.0.3。考虑为您的列使用TEXT类型;这些保留了尾随空间。 TEXT将为您处理字符串的encoding and decoding,因此您不必担心多字节字符。

TEXT的执行速度比VARBINARY慢。如果实际数据显示性能不可接受,则可能必须选择VARBINARY(或BLOB)。在这种情况下,您可以将字符串存储在特定编码中,如UTF-8。只要所有客户端使用相同的编码,这对于多字节字符都可以正常工作。使用不同的区域设置测试您的客户:)

答案 2 :(得分:0)

除了尾随空间问题之外,MySQL中的UNIQUE INDEX将限制为767字节(对于3字节UTF8,这使得767 / 3~ = 255)。另见: