| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
Reworld,下班在家制作游戏,1500万奖金等你拿编程微博 - 发现编程界的新鲜事
共有 744 人关注过本帖
标题:一个关于SQL Server字符串函数的问题
只看楼主 加入收藏
厨师王德榜
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:83
帖 子:517
专家分:1964
注 册:2013-2-16
结帖率:100%
  已结贴   问题点数:10  回复次数:6   
一个关于SQL Server字符串函数的问题
一个关于SQL Server字符串函数的问题 ,本想发在SQL Server版块的,但是觉得哪边人气不够,VFP这边的热心人要多一点,所以发在这里,请版主手下留情。
问题很简单,但是对我造成了困扰,代码如下(注意1:以下SQL Server代码,2、我的问题已经写在后面的注释里了):
程序代码:
Declare @RQ2 nvarchar(40)
set @RQ2='ABC And DEF'  + space(3)

print @rq2
print len(Rtrim(@RQ2))
print len(@rq2)

---------希望能输出如下结果---------
ABC And DEF   -- “ABC And DEF”后面应该能跟三个空格的。
11 -- 去右后空格,应该输出11才对。
14 -- 未去右后空格,应该输出14才对。
---------实际却得到如下结果---------
ABC And DEF   -- 经实测,“ABC And DEF”后面确实跟了三个空格的。
11 -- 这里输出11尚可理解,
11 -- 因为“ABC And DEF”后面确实跟了三个空格的。所以不能理解为何这里仍是输出11?

我是在SQL Server2000上测试的。
搜索更多相关主题的帖子: 字符串 color 
2015-09-17 10:32
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:99
帖 子:2617
专家分:6491
注 册:2015-3-25
  得分:0 
Declare @RQ2 nvarchar(40)
是可变长度,估计是空格给去掉了。
你把Declare @RQ2 char(40)
就知道了。

改为char(40),也是,估计是自动去掉后面的空格

[ 本帖最后由 mywisdom88 于 2015-9-17 10:48 编辑 ]
2015-09-17 10:44
muyubo
Rank: 9Rank: 9Rank: 9
来 自:山东莱芜
等 级:蜘蛛侠
威 望:3
帖 子:471
专家分:1017
注 册:2011-3-6
  得分:0 
VFP不认@rq2这种变量
2015-09-17 10:55
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:99
帖 子:2617
专家分:6491
注 册:2015-3-25
  得分:5 
sql varchar后自动填充空格解决方法
   关于使用sql server 2000(也许sql server 系列的数据库也会有这样的问题,我用的是2000的)varchar数据类型时,varchar列中会出现自动补齐空格的问题的解决方法
    当我们在修改密码成功后,但发现修改后的新密码不能登录了,但数据库中的密码的确被修改了,这时,很多人都会怀疑自己写的代码有错误,于是进行了无止境的寻找代码的错误,
但无论你怎么找,都不会发现问题的,为什么呢?我们可以想想,既然我们已经发现数据库里的密码的确被修改成看起来与我们想要修改的密码一致了,
那就可以肯定地说,不是我们的修改代码有错误了,如果代码有错误,那数据库里的密码是不会被修改的,但问题是为什么我们明明看到数据库里的密码已经修改了,但就是不能用修改后的新密码登录呢?
这时我们就应该把问题给转移到另一个地方了,哪里呢?数据库,对,这时我们应该到数据库里寻找我们的问题,这时我们会发现,我们用的数据类型最可以,于是,我在修改方法的代码里把我从数据库中
获取出的密码与其长度打印在后台中,才发现,我在数据库中密码用varchar类型,给最大的长度50,但我修改的新密码只有3位数,但奇怪的是,在后台输出的长度既然是50,也就是输出了passwd的最大长度
,这就让我郁闷了,通过这个打印的信息,确定自己的代码没有错误后,我便把注意力转到数据库,在查看数据库的建立没有错误,我看到了我的passwd(密码)的类型是varchar,最大长度为50,这时我意识到,
此时数据库已经默认在我新修改的密码后面填充了47个空格,经过在网上查找资料后,把这个问题给解决了。。呵呵,现在把解决的办法与大家共享。
   在使用char、varchar、binary 和 varbinary 数据类型的列时,建议始终将 ANSI_PADDING 设置为 ON。
   下面显示在将值插入含有 char、varchar、binary 和 varbinary 数据类型的列时,SET ANSI_PADDING 设置的效果。

设置 char(n) NOT NULL 或 binary(n) NOT NULL char(n) NULL 或 binary(n) NULL      varchar(n) 或 varbinary(n)
ON 将起始值(含有 char 列的尾随空格和 binary 列的尾随零)填充到列的长度。      当 SET ANSI_PADDING 为 ON 时,遵从与 char(n) 或 binary(n) NOT NULL 相同的规则。                                                                                       不剪裁插入 varchar 列中的字符值的尾随空格。不剪裁插入 varbinary 列中的二进制值的                                                                                      尾随零。不将值填充到列的长度。
OFF 将起始值(含有 char 列的尾随空格和 binary 列的尾随零)填充到列的长度。      当 SET ANSI_PADDING 为 OFF 时,遵从与 varchar 或 varbinary 相同的规则。 剪裁插入 varchar 列中的字符值的尾随空格。剪裁插入 varbinary 列中的二进制值的尾随零。

说明  当进行填充时,char 列由空格填充,binary 列由零填充。当进行剪裁时,char 列的尾随空格被剪裁,binary 列的尾随零被剪裁。
在计算列或索引视图上创建或操作索引时,SET ANSI_PADDING 必须为 ON。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息,请参见 SET 中的"使用 SET 语句时的注意事项"。
SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在连接时自动将 ANSI_PADDING 设置为 ON。这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性(它们在连接前在应用程序中设置)中进行配置。对来自 DB-Library 应用程序的连接,ANSI_PADDING 默认为 OFF。
nchar、nvarchar 和 ntext 列始终显示 SET ANSI_PADDING ON 行为,与 SET ANSI_PADDING 的当前设置无关。
当 SET ANSI_DEFAULTS 为 ON 时,将启用 SET ANSI_PADDING。
SET ANSI_PADDING 的设置是在执行或运行时设置,而不是在分析时设置。

示例
下例演示该设置如何影响这些数据类型中的每一个。
SET ANSI_PADDING ON
GO
create table Users1
(
userid varchar(50) not null,
username varchar(50) not null,
passwd nvarchar(50) not null,
email varchar(50) not null,
phone varchar(50) not null,
majors varchar(50) not null,
college varchar(50) not null,
place varchar(50) not null
)
2015-09-17 10:56
mywisdom88
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:99
帖 子:2617
专家分:6491
注 册:2015-3-25
  得分:0 
2015-09-17 11:03
mxbing1984
Rank: 7Rank: 7Rank: 7
来 自:贵州道真
等 级:贵宾
威 望:37
帖 子:73
专家分:342
注 册:2014-8-8
  得分:5 
/*
MSSQL的Len函数是这样解释的,返回指定字符串表达式的字符数,其中不包含尾随空格.
也就是
print len(Rtrim(@RQ2))
print len(@rq2)
这两个效果是一样的
但是这个变量后面确实有3个空格
*/
Declare @RQ2 varchar(40)
set @RQ2='ABC And DEF'  + space(3)
print @rq2
print len(Rtrim(@RQ2))
print len(@rq2)
print datalength(@RQ2)
/*
酱紫
ABC And DEF   
11
11
14
*/
--datalength返回的是字节数
Declare @RQ2 nvarchar(40)
set @RQ2='ABC And DEF'  + space(3)
print @rq2
print len(Rtrim(@RQ2))
print len(@rq2)
print datalength(@RQ2)
/*
ABC And DEF   
11
11
28
*/

天再高,踮起脚尖就能更接近阳光
2015-09-17 11:49
厨师王德榜
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:83
帖 子:517
专家分:1964
注 册:2013-2-16
  得分:0 
好,谢谢各位,
一个 SET ANSI_PADDING ON
另一个是Datelenth()
都是我以前没有注意到的。我看可以结帖了。
2015-09-17 16:50
快速回复:一个关于SQL Server字符串函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067882 second(s), 7 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved