求教sql server 中字符长度的问题!!(100分)

L

lyhold

Unregistered / Unconfirmed
GUEST, unregistred user!
求教sql server 中字符长度的问题!!

我在库中有个字段(比如住址),他里面可以存储中文跟英文(当然也可以混合存储)
现在我用select max(len(rtrim(地址) from tablename
如果地址的最大长度字段是 (和平36号ccc)
他显示的是8
但是在打印的时候(qreport),一个汉字是风配两个字符的,怎样让sql server
汉字默认成两个长度,这样我程序打印出来的宽度才是对的。
 
这主要是服务端是双字节编码。

在客户端计算长度

或者在服务端转换为单字节编码后再计算长度。
 
to jsxjd
客户段计算机很非时间(我循环比较adoquery.fieldbyanme(fieldname)看哪个最长,
不知道有没有好的办法),
我的内存数据太大,所以去最大长度很费时,我想在服务器执行,返回结果
但是不知道怎么转换,请指教!!
 
SQL中的长度和Delphi中的长度是不完全一样的!
在SQL中长度是按照字符计算
在Delphi中的长度是按照字节计算!
 
是的。这个问题怎么解决啊。!!!!
 
在sql server里怎么同过函数把他转化成单字节啊?
 
这是服务器的语言设置问题,SQL Server 2000把语言自动设置为简体中文,
你可以使用语句
SET LANGUAGE us_english
将服务器默认语言改为英文试试!
 
It's useless
 
将服务器默认语言改为英文试试!
还是不行!!!
 
告诉你一个密秘,你可以用存储过程来求得你要的结果!!
下面给你一个示例代码你看看:
declare @ii int,@jj int,@ff char(30)
declare @cc as char(30)
declare @bb as char(30)//其中@ff、@cc、@bb的长度要等于字段定义的长度(按字节算)
declare @xx int,@yy int
set @xx=(select col_length('bj','dj_code')) //求得给定表的列的定义长度,这里要更改为你的表名和字段名
set @yy=0      //计数变量初始化
declare cs cursor scroll for select dj_code from bj   //声明一个游标变量
open cs     //打开游标变量
fetch first from cs into @ff  //将记录定位在第一个上面

while @@fetch_status = 0 begin  //循环每一行
set @ii=len(@ff) //求当前记录的数据长度(这个长度是按一个汉字一个计算的)
set @bb=rtrim(@ff) + '??????????????????????????????' //这句是为了求出这个记录中去除已有字符,还可再存储多少个byte
//这后面的?的个数等于本字段的长度
set @jj=(select len(@bb))   //由于len是按一个汉字一个计算的,所以这时返回的长度一定是<=字段定义长度
set @ii=@ii+@xx-@jj      //求出本字段的字节长度
if @ii > @yy
set @yy=@ii //找出最大字节长度的长度值

fetch next from cs into @ff
if @@fetch_status=-1 break
end
close cs
deallocate cs

你可以更改这段代码,让它返回最长字段的字节长度,并可以加上输入参数来输入表名和字段名,这样就比较通用了。
 
len()返回莫字符串表达式的长度
datalength()返回字节数
试试用datalength()
 
谢谢funnyfan8,你的答案我已试啦。通过!!!
 
使用datalength是返回字节的长度,但是当在字段值后有空格时它也将其长度返回,所以按
你的要求就不对了,因为打印时后尾空格是不应计入的。另外我在sql2000中试验了一下:
使用字符串:[red]你好!hello[/red] 它应当字节长度是 10 使用len长度是 8
我将其存入一个长度为30的char字段中,使用datalength(rtrim(字段名)) from 表名 where 唯一条件
得出的长度是 16 而使用上面的存储过程得出的长度是 10,如果直接使用datalength('你好!hello')得出
的结果也是 10 , 不知为什么会得出长度为16。
我将库清空后再插入后结果同上。
 
顶部