2010-11-01 26 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

相关问题