1、原来一直在使用varchar(n),但不是很清楚这个n的最大值是多少。查了一下
sybase的用户手册,n的范围为
数据库的页大小,
即使用select @@maxpagesize查到的数字。
比如说当事人名称为“张三、李四、”,在原来的cp850库返回的结果是“张三、李四。但是升级到utf-8之后,返回的就是“张三、李”。
主要是cp850字符集,一个汉字占两个 字节,而升级到utf-8之后就占三个字节了,所以这里的减2就不正确了。
执行如下的脚本
所以最终把代码改为如下就正确了, 字符集就不会影响结果。
即使用select @@maxpagesize查到的数字。
除非设定string_rtruncation on,Adaptive Server将条目截断到指定列的长度而不加警告或出现错误信息。
2、数据库从cp850迁移到utf-8环境之后,原来的获取当事人名称的存储过程返回的结果有误,即有名称被截取的
问题,如下
代码:
--
去掉末尾的顿号
set @MC = substring ( @MC , 1 , len ( @MC ) - 2 )
set @MC = substring ( @MC , 1 , len ( @MC ) - 2 )
比如说当事人名称为“张三、李四、”,在原来的cp850库返回的结果是“张三、李四。但是升级到utf-8之后,返回的就是“张三、李”。
主要是cp850字符集,一个汉字占两个 字节,而升级到utf-8之后就占三个字节了,所以这里的减2就不正确了。
执行如下的脚本
declare
@MC
varchar
(
100
)
declare @length int
set @MC = ' 张三、李四、 '
set @length = len ( @MC )
print ' %1! ' , @length
set @MC = substring ( @MC , 1 , len ( @MC ) - len ( ' 、 ' ))
print ' %1! ' , @MC
在cp850下,print '%1!', @length打印的长度为12,而在utf-8下则返回的是6。当然print '%1!', @MC打印的结果都是"张三、李四"
declare @length int
set @MC = ' 张三、李四、 '
set @length = len ( @MC )
print ' %1! ' , @length
set @MC = substring ( @MC , 1 , len ( @MC ) - len ( ' 、 ' ))
print ' %1! ' , @MC
所以最终把代码改为如下就正确了, 字符集就不会影响结果。
--
去掉末尾的顿号
set @MC = substring ( @MC , 1 , len ( @MC ) - len ( ' 、 ' ))
set @MC = substring ( @MC , 1 , len ( @MC ) - len ( ' 、 ' ))
经常看到数据库版本限制引起的各种问题,看来有些知识需要普及一下。
除了查手册外,再提供一种比较方便的方法,可以得到当前ASE服务器上各项限制值。
执行如下命令即可:
dbcc traceon( 3604 )
go
dbcc serverlimits
go
除了查手册外,再提供一种比较方便的方法,可以得到当前ASE服务器上各项限制值。
执行如下命令即可:
dbcc traceon( 3604 )
go
dbcc serverlimits
go