sql中len问题.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HYPERLINK /server-you/archive/2006/09/20/509945.html Sql中LEN函数处理汉字长度问题(sql、len、字节) Posted on 2006-09-20 18:34 HYPERLINK /server-you/ 李飞 阅读(4698) HYPERLINK /server-you/archive/2006/09/20/509945.aspx \l commentform#commentform 评论(0) ? HYPERLINK /server-you/admin/EditPosts.aspx?postid=509945 编辑 HYPERLINK /server-you/archive/2006/09/20/509945.aspx \l # 收藏 所属分类: HYPERLINK /server-you/category/70165.html SQL 汉字是由两个字节存储的,每个字节的数值都127。所以上面的问题的解决方案就是:把字符串按字节顺序截取,当出现第一个字节是127,但是后面一个字节是127的这种情况,就丢弃掉。 接下来,我们要明确些技术细节: (1) 在SQL Server中有很多字符串相关的操作函数,但是直接去操作包含了汉字的字符串,会有点问题。说明如下:LEN计算长度的时候,会把汉字和英文字符都看成长度一样的;substring也是这样,ascii是返回第一个字节的ASCII 码。 Example: select len(你好a),substring(你好a,1,1),ascii(你) 结果是 ???????????????????????????? ----------- ????? ---- - ????? ---------- 3?????????? 你??? ????? 196 一定要把字符串要转换成varbinary来处理,才可以。 ? (2) SQL Server中,如何把ASCII码组合成汉字,就是把高字节和底字节分别转成字符再拼接起来。如char(210)+char(166)就是姚这个汉字。 再明确了上面的技术细节后,接下来就可以解决问题了。我通过编写一个函数来解决问题。 create function fn_TruncSemiHanzi(@str varchar(4000)) returns?varchar(8000) as begin declare @sTmp varchar(8000),@i int,@itmp int,@itmp2 int ,@stmp2 varchar(2) select @sTmp= ?select @i=1 ?while @i=len(@str) ?begin ???? select @itmp=convert(int,substring(convert(varbinary,substring(@str ,@i,1)),1,1)) --截取一个字节 ??? if @itmp127 ? ??? begin ????? --大于127检查后面一个字节 select @itmp2=convert(int,substring(convert(varbinary,substring(@str ,@i,1)),2,1)) ?????? if @itmp2127 ????? begin ??????? select @stmp2=char(@itmp)+char(@itmp2)?? --是一个完整的汉字 ???? end ???? else ???? begin ??????? select @stmp2=char(@itmp2)?? --丢弃半个汉字 ??? end ?end ?else ?begin ????? select @sTmp2=char(@itmp) ?end ?? select @sTmp=@sTmp+@stmp2 ?? select @i=@i+1 ?end ?? return @stmp end 测试如下: DECLARE @str varchar(4000) -- 设置参数值 -- 设置参数值 --带有半个汉字,是你这个汉字的前面一部分 select @str=b+char(convert(int,substring(convert(varbinary,你),1,1)))+a你 select @str?带有半个汉字,dbo.fn_TruncSemiHanzi(@str) 去掉半个汉字 ? 带有半个汉字?? 长度??? 去掉半个汉字?? 长度????????? ------------------ ----------- --------------- ----------

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档