关于varchar的长度和数据库字符集迁移的问题

本文探讨了Sybase数据库中varchar类型的最大长度及其受页大小的影响,并通过实例演示了从cp850到utf-8字符集迁移时可能出现的数据截断问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值