我正在开发一个项目,我必须确保不会在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文档或其他地方没有看到有关这方面的提示,所以我在这里问。
您最安全的赌注可能是'RTRIM(value)',因为它会随着MySQL的“尾部空间”定义自动更新。 – Marvin
@Marvin感谢您的建议和+1。但是由于某些原因,我想让应用程序尽可能地做更多的工作(包括修剪)。此外,我一般对这个问题的答案感兴趣。我们是否需要查找一些SQL规范来获得这个答案? – Binarus
MySQL只会移除单个ascii 0x20字符(“空格”),没有其他unicode值(不称为空格,但“空间”)。这就是说,虽然不太可能,但不能保证它在某些时候不会改变 - 但它肯定会被记录下来。不幸的是,查看SQL标准并不会帮助你,因为'rtrim'和'ltrim'不管用什么标准函数(尽管它将'space'定义为'trim'的默认值)。但最终您将不得不查看源代码,信任互联网或测试(有限数量的)unicode空间。 –
Solarflare