- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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) 去掉半个汉字
?
带有半个汉字?? 长度??? 去掉半个汉字?? 长度?????????
------------------ ----------- --------------- ----------
您可能关注的文档
最近下载
- 第6课 推动形成全面对外开放新局面.pptx VIP
- 电规总院解析2018中国能源发展情况.PDF
- 2023届高考模拟作文“《山月记》我深怕自己并非美玉”导写及范文.docx VIP
- 冰淇淋本部冷冻饮品生产工艺作业指.pdf VIP
- GB_T 14598.1871-2024 量度继电器和保护装置 第187-1部分:差动保护的功能要求 电动机、发电机和变压器比率制动差动保护和差动速断保护.pdf VIP
- 七年级数学动点题50道.doc VIP
- “多测合一”收费指导标准(示范文本) .pdf VIP
- 煤矿采掘失调原因分析及对策探讨.doc VIP
- jtge20-2011公路工程沥青及沥青混合料试验规程.pdf VIP
- 中国的文人与士大夫文化传统.pptx VIP
原创力文档


文档评论(0)