2017-08-27 406 views
2

我正在开发一个项目,我必须确保不会在MySQL 5.5数据库后端存储具有MySQL文档所谓的“尾随空格”(这主要是由于oddities with char and varchar fields, unique indexes and comparisons)导致的字符串。究竟是MySQL中的“尾随空间”究竟是什么?

这基本上意味着应用程序必须在将所有字符串存储在数据库中之前删除“尾随空格”。虽然这一眼看起来很容易,但我正在问自己在这种情况下究竟有什么(尾随)空格。

当然,ASCII 0x20是一个空格。但是还有许多其他(unicode)字符,通常被认为是空格(至少在MySQL世界之外)。例子是U + 00A0(非休息空间)和U + 200B(零宽度空间),以命名其中的两个;我很确定他们中至少有十二个人。

我非常强烈地认为MySQL在上面提到的上下文中只考虑了通常的空格字符(ASCII 0x20)作为空间,但我想确切地知道。我在MySQL文档或其他地方没有看到有关这方面的提示,所以我在这里问。

+2

您最安全的赌注可能是'RTRIM(value)',因为它会随着MySQL的“尾部空间”定义自动更新。 – Marvin

+0

@Marvin感谢您的建议和+1。但是由于某些原因,我想让应用程序尽可能地做更多的工作(包括修剪)。此外,我一般对这个问题的答案感兴趣。我们是否需要查找一些SQL规范来获得这个答案? – Binarus

+0

MySQL只会移除单个ascii 0x20字符(“空格”),没有其他unicode值(不称为空格,但“空间”)。这就是说,虽然不太可能,但不能保证它在某些时候不会改变 - 但它肯定会被记录下来。不幸的是,查看SQL标准并不会帮助你,因为'rtrim'和'ltrim'不管用什么标准函数(尽管它将'space'定义为'trim'的默认值)。但最终您将不得不查看源代码,信任互联网或测试(有限数量的)unicode空间。 – Solarflare

回答

0

为了回答我自己的问题,SQL:2006的最终草案,第2部分以及稍后的SQL版本的后续(非最终)工作草案都包含一个类似的处理该主题的文章。

从第一个(第4.2.1章,介绍字符串,重点煤矿):

字符集分为三类:国家 或国际标准定义,那些由SQL的定义实现和由应用程序定义的那些。由 [ISO10646]和[Unicode]定义的字符集被称为通用字符集(UCS) ,其处理在第4.2.8小节“通用 字符集”中进行了描述。 每个字符集包含<空间>字符 (相当于U + 0020)。应用程序定义了一个字符集,由 为前两个 类别之一的字符集分配新名称。它们可以被定义为“驻留”在由应用程序选择的任何模式中。由标准或由 定义的字符集SQL实现驻留在每个目录中的信息模式(名为 INFORMATION_SCHEMA)中,以及通过SQL实现定义的由 标准和归类,音译和转码定义 定义的归类。

恕我直言,这毫无疑问是ASCII为0x20是唯一件事SQL标准(因此MySQL的)认为<空间>,特别是当考虑到这两个标准和MySQL文档写的是如所示的字符,即包括尖括号。