我相信这个问题的答案是“不”,但我对社区意见很感兴趣。一个varchar或nvarchar值应该自动修剪尾随的空格,所以我不认为我应该永远不必在这个值上调用RTRIM()。有没有专家有我需要的理由?我是否需要在varchar或nvarchar值上调用RTRIM()?
(如果标签不说清楚,我特别提到到Microsoft SQL Server。)
我相信这个问题的答案是“不”,但我对社区意见很感兴趣。一个varchar或nvarchar值应该自动修剪尾随的空格,所以我不认为我应该永远不必在这个值上调用RTRIM()。有没有专家有我需要的理由?我是否需要在varchar或nvarchar值上调用RTRIM()?
(如果标签不说清楚,我特别提到到Microsoft SQL Server。)
如果ANSI_PADDING是ON,则尾随空格将被存储,即使为varchar/nvarchar数据类型,所以是。
您可能不需要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'
是的,Hugh Darwen在他的题为“The Askew Wall”的传奇式演讲中谈到了这一点,并认为它是SQL DBMS的主要失败之一 – McKay 2010-11-01 19:23:31
(n)varchar
只利用了使用的空间量,所以它不应该包含空格。通常用于从分配过多的char
字段中删除额外空间,即仅包含10个字符的。
Au contraire。 SET ANSI_PADDING ... – gbn 2010-11-01 19:23:22
@gbn,你又做到了! :)我从你那里学到很多东西!这是我遗失的NULL | NOT NULL片断。 – 2010-11-01 19:26:19
从MSDN注意(http://msdn.microsoft.com/en-us/library/ms187403。aspx):在未来版本的MicrosoftSQL Server中,ANSI_PADDING将始终为ON,并且任何将该选项明确设置为OFF的应用程序都会产生错误。避免在新开发工作中使用此功能,并计划修改当前使用此功能的应用程序。 – 2010-11-01 19:27:32
LIKE
运营商存在一个奇怪的情况。例如:
select 1 where convert(nvarchar(10), 'a') like convert(nvarchar(10), '%a ')
不会返回结果。
理论上,是的,因为SET ANSI_PADDING
默认为ON,并且将来总是ON。
说实话,我倾向于写在RTRIM上,因为这样可以避免在阅读中发生这种情况。远远更多。它只会发生一次,以破坏你的一天...
它取决于,例如德尔福客户端数据集和midas.dll使用它(至少版本7和以前(不知道现在)曾经有错误的是,如果Nvarchar字段中的数据长度小于指定的数据长度,那么它们将用于填充。
在数据库方面没有这么多问题,但在客户端它没有造成什么问题。麻烦量
SQL服务器(以及大多数其他的SQL数据库管理系统)实在太烂,当谈到这样的东西:
insert into Blah values ('careful ');
insert into Blah values ('careful');
假设有一个id列或其他东西
值会比较相同,据说会有相同的长度,但实际上不会有相同的数据。级联
select Bar + 'something' from Blah
和一个会有空间,另一个不会。
我从来没有。 – 2010-11-01 19:14:08