首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql varbinary varchar

mysql varbinary varchar
EN

Stack Overflow用户
提问于 2009-06-10 06:06:24
回答 3查看 7K关注 0票数 4

我们使用varchar(255)在mysql中存储“关键字”。我们所面临的问题是mysql为"=“中的比较目的忽略了所有尾随空格。它确实尊重“喜欢”比较中的尾随空格,但如果它上面有“唯一”索引,则不允许我们在varchar列中存储带和不带尾空格的相同单词。

因此,我们正在考虑切换到var二进制文件。当列值中有多字节字符时,有人能提出什么暗示吗?

EN

回答 3

Stack Overflow用户

发布于 2009-06-17 07:03:25

安多玛,

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

所有MySQL排序规则都是PADSPACE类型的。这意味着对MySQL中的所有CHAR和VARCHAR值进行比较,而不考虑任何尾随空格。对于所有MySQL版本来说都是这样,并且在存储VARCHAR值之前,您的版本是否会从VARCHAR值中减少尾随空格也没有什么区别。

此外,mysql考虑索引中有/没有尾随空格的文本:

如果某一列的索引要求有唯一的值,则如果删除尾随字符或忽略它们,则在列值中插入仅与尾垫字符数目不同的值将导致重复键错误。例如,如果表包含'a',尝试存储'a‘会导致重复键错误。

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

票数 2
EN

Stack Overflow用户

发布于 2009-06-10 08:16:17

这就是MySQL手册对尾随空格的看法:

尾随空间的处理取决于版本。从MySQL 5.0.3开始,在存储和检索值时,将保留尾随空格,这与标准的SQL一致。在VARCHAR 5.0.3之前,当尾随空格存储到VARCHAR列中时,它们将从值中移除;这意味着从检索到的值中也没有这些空格。

由于您的问题是MySQL不会重新设置尾随空格,所以我假设您的版本低于5.0.3。考虑为您的列使用文本类型;这些类型保留尾随空格。文本将为您处理字符串的编解码,因此您不必担心多字节字符。

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

票数 0
EN

Stack Overflow用户

发布于 2011-05-11 18:39:49

除了尾随空间问题之外,MySQL中的唯一索引将限制在767字节(这使得3字节UTF8为767/3 ~= 255 )。另请参阅:

  • http://bugs.mysql.com/bug.php?id=4541
  • http://bugs.mysql.com/bug.php?id=42193
  • http://code.djangoproject.com/ticket/9431
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/973923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档