2017-08-27 190 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文檔寫的是如所示的字符,即包括尖括號。