2012-07-30 69 views
0

我有一個名爲PremiseID的主鍵的數據庫表。字符字段可以保留尾部空格字符嗎?

其MySQL列定義是CHAR(10)。

進入列的數據總是10位數字,可以是9位數字後跟空格,如「113091000」或9位數字後跟字母,如「113091000A」。

我試過將這些值之一寫入測試MySQL數據庫表t1中的表中。它有三列

mainid integer 
parentid integer 
premiseid char(10) 

如果我插入具有以下值的行:1,1,'113091000 '並嘗試讀取行回來,「113991000」值將被截斷,所以它讀取「113091000」;那是空間被刪除。如果我插入一個數字,如'113091000A',則保留該值。

如何獲得CHAR(10)字段保留空格字符?

我有一個解決此問題的編程方法。這將是len('113091000'),意識到它是九個字符,然後意識到9個推測的長度有一個空格後綴的數字。

回答

2

要從MySQL reference引用:

一個CHAR列的長度是固定的,當你創建表所聲明的長度。長度可以是從0到255之間的任何值。當存儲CHAR值時,它們將空格填充到指定的長度。當檢索到CHAR值時,刪除尾隨空格。

所以沒有辦法繞過它。如果你使用MySQL 5.0.3或更高版本,然後使用VARCHAR可能是要走(開銷僅爲1額外的字節)的最佳方式:

VARCHAR值不填充存儲,當他們。尾隨空格的處理取決於版本。從MySQL 5.0.3開始,根據標準SQL存儲和檢索值時會保留尾隨空格。在MySQL 5.0.3之前,將尾部空格存儲到VARCHAR列時將從值中刪除;這意味着空間也沒有被檢索到的值。

如果你使用MySQL 5.0.3 <,那麼我認爲你必須要檢查返回的長度,或使用一個空格以外的字符。

可能最便攜的解決方案是隻使用CHAR並檢查返回的長度。

1

標準CHAR(10)列將始終有尾隨空格,以便將字符串填充到所需的10個字符長度。因此,任何故意拖尾的空格都會混入並且通常會被數據庫適配器剝離。

如果可能,請轉換爲VARCHAR(10)列,如果要保留尾隨空格。您可以使用ALTER TABLE聲明執行此操作。

2

問:如何獲得CHAR(10)字段保留空格字符?

實際上,該空間被保留和存儲。這是刪除空格的值的檢索。 (刪除返回值的尾部空格是一個記錄的「功能」。)

一個選項(作爲解決方法)是修改您的SQL查詢以將尾隨空格附加到返回的值,例如,

SELECT RPAD(premiseid,10,' ') AS premiseid FROM t1 

,將與返回的值作爲一個字符串爲10個字符的長度,用空格填充如果該值小於10個字符,或者如果它再被截斷至10個字符。

1

儘管戈登的答案本身可能還是正確的,但在後來的版本中還是提到了解決方案。
在您的代碼中運行SET sql_mode ='PAD_CHAR_TO_FULL_LENGTH';

通過此會話設置,您將檢索CHAR(10)全長的完美列,而VARCHAR不會在未預先輸入尾隨空格的情況下進行檢索。如果你不需要空格,你總是可以rtrim()。

相關問題