“a”究竟是什么;尾随空格“;在MySQL中?

“a”究竟是什么;尾随空格“;在MySQL中?,mysql,special-characters,Mysql,Special Characters,我正在从事一个项目,在这个项目中,我必须确保我不会在MySQL 5.5数据库后端存储字符串,因为MySQL文档称其为“尾随空格”(这主要是由于错误) 这基本上意味着应用程序必须在将所有字符串存储到数据库中之前,从所有字符串中删除“尾随空格”。虽然乍一看这很容易,但我在问自己,在这个上下文中(尾随)空格到底是什么 当然,ASCII 0x20是一个空格。但还有许多其他(unicode)字符通常被视为空格(至少在MySQL世界之外)。举两个例子,U+00A0(非中断空间)和U+200B(零宽度空间);

我正在从事一个项目,在这个项目中,我必须确保我不会在MySQL 5.5数据库后端存储字符串,因为MySQL文档称其为“尾随空格”(这主要是由于错误)

这基本上意味着应用程序必须在将所有字符串存储到数据库中之前,从所有字符串中删除“尾随空格”。虽然乍一看这很容易,但我在问自己,在这个上下文中(尾随)空格到底是什么

当然,ASCII 0x20是一个空格。但还有许多其他(unicode)字符通常被视为空格(至少在MySQL世界之外)。举两个例子,U+00A0(非中断空间)和U+200B(零宽度空间);我很肯定至少还有十几个


我非常强烈地假设MySQL在上面提到的上下文中只考虑通常的空格字符(ASCII 0x20)作为空格,但是我还是想确定一下。我在MySQL文档或其他地方没有看到关于这一点的提示,所以我在这里提问。

为了回答我自己的问题,SQL:2006的最终草案第2部分和更高版本SQL的更高版本(非最终)工作草案都包含了一段类似的段落,其中涉及到这个主题

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

字符集分为三类:由国家定义的字符集 或由SQL实现定义的国际标准,以及 由应用程序定义的。由定义的字符集 [ISO10646]和[Unicode]被称为通用字符集(UCS) 第4.2.8款“通用”对其处理进行了说明 字符集”每个字符集都包含该字符 (相当于U+0020)。应用程序通过 将前两个名称之一的新名称指定给字符集 类别。它们可以定义为“驻留”在用户选择的任何模式中 应用程序。由标准或标准定义的字符集 SQL实现驻留在信息模式中(名为 每个目录中的信息(架构),以及 定义标准和排序规则、音译和转码 通过SQLImplements


恕我直言,毫无疑问,ASCII 0x20是SQL标准(以及MySQL)唯一考虑的东西,特别是考虑到标准和MySQL文档都是按所示写入字符,即包括尖括号。

您最安全的赌注可能是
RTRIM(value)
这会自动更新MySQL对“尾随空间”的定义。@Marvin感谢您的建议和+1。但出于某些原因,我希望让应用程序尽可能多地完成工作(包括修剪)。此外,我一般对这个问题的答案感兴趣。我们需要查找一些SQL规范来回答这个问题吗?MySQL将只删除单个ascii 0x20字符(“空格”),而不删除其他unicode值(不称为空格,而是“空格”)。也就是说,虽然不太可能,但不能保证它在某个时候不会改变——但它肯定会被记录下来。不幸的是,查看sql标准对您没有帮助,因为
rtrim
ltrim
无论如何都不是标准函数(尽管它将“空格”定义为
trim
的默认值)。但最终您将不得不研究源代码、信任互联网或测试(数量有限的)unicode空间。@Solarflare谢谢!我就是这么想的。关于您评论的第二部分:AFAIK,在比较时剪切尾随空格是SQL标准的一部分,即使ltrim和rtrim不是。所以我希望这个标准能够准确地定义哪些字符被认为是空格字符。测试所有unicode空格字符是我想要避免的事情,因为我永远不能确定我真的测试了所有字符。毕竟,如果SQL标准没有定义它,那么由MySQL(任意)决定什么是空格字符。