2010-11-01 27 views
8

我相信這個問題的答案是「不」,但我對社區意見很感興趣。一個varchar或nvarchar值應該自動修剪尾隨的空格,所以我不認爲我應該永遠不必在這個值上調用RTRIM()。有沒有專家有我需要的理由?我是否需要在varchar或nvarchar值上調用RTRIM()?

(如果標籤不說清楚,我特別提到到Microsoft SQL Server。)

+0

我從來沒有。 – 2010-11-01 19:14:08

回答

11

如果ANSI_PADDING是ON,則尾隨空格將被存儲,即使爲varchar/nvarchar數據類型,所以是。

4

您可能不需要RTRIM得到的值出一個簡單的選擇,但如果你想將您可能需要的值(例如,結合姓名和姓氏以顯示全名)聯合起來。

運行這個測試,看看我的意思是:

create table #temp (test varchar (10)) 

insert #temp 
values ('test ') 
insert #temp 
values ('test2 ') 
insert #temp 
values ('test ') 
insert #temp 
values ('test') 

select test + '1' from #temp 
select rtrim(test) +'1' from #temp 
select * from #temp where test = 'test' 
+1

是的,Hugh Darwen在他的題爲「The Askew Wall」的傳奇式演講中談到了這一點,並認爲它是SQL DBMS的主要失敗之一 – McKay 2010-11-01 19:23:31

0

(n)varchar只利用了使用的空間量,所以它不應該包含空格。通常用於從分配過多的char字段中刪除額外空間,即僅包含10個字符的​​。

+0

Au contraire。 SET ANSI_PADDING ... – gbn 2010-11-01 19:23:22

+0

@gbn,你又做到了! :)我從你那裏學到很多東西!這是我遺失的NULL | NOT NULL片斷。 – 2010-11-01 19:26:19

+0

從MSDN注意(http://msdn.microsoft.com/en-us/library/ms187403。aspx):在未來版本的MicrosoftSQL Server中,ANSI_PADDING將始終爲ON,並且任何將該選項明確設置爲OFF的應用程序都會產生錯誤。避免在新開發工作中使用此功能,並計劃修改當前使用此功能的應用程序。 – 2010-11-01 19:27:32

0

LIKE運營商存在一個奇怪的情況。例如:

select 1 where convert(nvarchar(10), 'a') like convert(nvarchar(10), '%a ') 

不會返回結果。

3

理論上,是的,因爲SET ANSI_PADDING默認爲ON,並且將來總是ON。

說實話,我傾向於寫在RTRIM上,因爲這樣可以避免在閱讀中發生這種情況。遠遠更多。它只會發生一次,以破壞你的一天...

0

它取決於,例如德爾福客戶端數據集和midas.dll使用它(至少版本7和以前(不知道現在)曾經有錯誤的是,如果Nvarchar字段中的數據長度小於指定的數據長度,那麼它們將用於填充。

在數據庫方面沒有這麼多問題,但在客戶端它沒有造成什麼問題。麻煩量

1

SQL服務器(以及大多數其他的SQL數據庫管理系統)實在太爛,當談到這樣的東西:

insert into Blah values ('careful '); 
insert into Blah values ('careful'); 

假設有一個id列或其他東西

值會比較相同,據說會有相同的長度,但實際上不會有相同的數據。級聯

select Bar + 'something' from Blah 

和一個會有空間,另一個不會。

+1

DATALENGTH會顯示差異,LEN修剪 – gbn 2010-11-01 19:24:33

+0

@gbn是的,數據實際上是不同的,這是我的觀點。就像連接的例子一樣,有些方法可以獲得差異,但它們相比是相同的。假設SQL的失敗是它不符合數學前提:對於所有a = b,f(a)= f(b) – McKay 2010-11-01 20:00:17

相關問題