如何在2000中处理半个汉字的问题
2008-04-27 20:38
369 查看
/*writtenbyenydraboy,2003-07-17*/
/*发表于CSDN*/
/*转载请注明出处和保留此版权信息*/
在csdn的专家论坛中,看到有一位朋友问起关于“由于从其它中导入的数据存在半个汉字的问题,所以希望能在查询语句中将这半个汉字处理掉,怎么处理都行。望各位高手不吝赐教!”的问题,启初有点意外,但是后来觉得从这个问题可以带出一些SQLServer汉字中存储和处理的方法,觉得有必要总结一下。
汉字是由两个字节存储的,每个字节的数值都>127。所以上面的问题的解决方案就是:把字符串按字节顺序截取,当出现第一个字节是>127,但是后面一个字节是<127的这种情况,就丢弃掉。
接下来,我们要明确些技术细节:
(1)在SQLServer中有很多字符串相关的操作函数,但是直接去操作包含了汉字的字符串,会有点问题。说明如下:LEN计算长度的时候,会把汉字和英文字符都看成长度一样的;substring也是这样,ascii是返回第一个字节的ASCII码。
Example:
selectlen('你好a'),substring('你好a',1,1),ascii('你')
结果是
----------- ----- ----------
3 你 196
一定要把字符串要转换成varbinary来处理,才可以。
(2)SQLServer中,如何把ASCII码组合成汉字,就是把高字节和底字节分别转成字符再拼接起来。如char(210)+char(166)就是姚这个汉字。
再明确了上面的技术细节后,接下来就可以解决问题了。我通过编写一个函数来解决问题。
createfunctionfn_TruncSemiHanzi(@strvarchar(4000))
returns varchar(8000)
as
begin
declare
@sTmpvarchar(8000),@iint,@itmpint,@itmp2int,@stmp2varchar(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@itmp>127
begin
--大于127检查后面一个字节
select@itmp2=convert(int,substring(convert(varbinary,substring(@str,@i,1)),2,1))
if@itmp2>127
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@strvarchar(4000)
--设置参数值
--设置参数值
--带有半个汉字,是你这个汉字的前面一部分
select@str='b'+char(convert(int,substring(convert(varbinary,'你'),1,1)))+'a你'
select@str 带有半个汉字,dbo.fn_TruncSemiHanzi(@str)去掉半个汉字
带有半个汉字 长度 去掉半个汉字 长度 1
/*发表于CSDN*/
/*转载请注明出处和保留此版权信息*/
在csdn的专家论坛中,看到有一位朋友问起关于“由于从其它中导入的数据存在半个汉字的问题,所以希望能在查询语句中将这半个汉字处理掉,怎么处理都行。望各位高手不吝赐教!”的问题,启初有点意外,但是后来觉得从这个问题可以带出一些SQLServer汉字中存储和处理的方法,觉得有必要总结一下。
汉字是由两个字节存储的,每个字节的数值都>127。所以上面的问题的解决方案就是:把字符串按字节顺序截取,当出现第一个字节是>127,但是后面一个字节是<127的这种情况,就丢弃掉。
接下来,我们要明确些技术细节:
(1)在SQLServer中有很多字符串相关的操作函数,但是直接去操作包含了汉字的字符串,会有点问题。说明如下:LEN计算长度的时候,会把汉字和英文字符都看成长度一样的;substring也是这样,ascii是返回第一个字节的ASCII码。
Example:
selectlen('你好a'),substring('你好a',1,1),ascii('你')
结果是
----------- ----- ----------
3 你 196
一定要把字符串要转换成varbinary来处理,才可以。
(2)SQLServer中,如何把ASCII码组合成汉字,就是把高字节和底字节分别转成字符再拼接起来。如char(210)+char(166)就是姚这个汉字。
再明确了上面的技术细节后,接下来就可以解决问题了。我通过编写一个函数来解决问题。
createfunctionfn_TruncSemiHanzi(@strvarchar(4000))
returns varchar(8000)
as
begin
declare
@sTmpvarchar(8000),@iint,@itmpint,@itmp2int,@stmp2varchar(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@itmp>127
begin
--大于127检查后面一个字节
select@itmp2=convert(int,substring(convert(varbinary,substring(@str,@i,1)),2,1))
if@itmp2>127
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@strvarchar(4000)
--设置参数值
--设置参数值
--带有半个汉字,是你这个汉字的前面一部分
select@str='b'+char(convert(int,substring(convert(varbinary,'你'),1,1)))+'a你'
select@str 带有半个汉字,dbo.fn_TruncSemiHanzi(@str)去掉半个汉字
带有半个汉字 长度 去掉半个汉字 长度 1
相关文章推荐
- 如何在SQL Server2000中处理半个汉字的问题
- [导入]如何在SQL Server2000中处理半个汉字的问题(转)
- 如何在SQL Server2000中处理半个汉字的问题
- 在SQL Server 2000中处理半个汉字的问题
- 如何在SQL Server2000中处理半个汉字的问题
- 在SQL Server2000中处理半个汉字的问题(2)
- 在SQL Server2000中处理半个汉字的问题(1)
- 如何处理Beyond Compare禁止编辑问题
- 七牛云图片处理实践之GIF|如何解决GIF流量爆炸问题?
- 在c语言中如何用数组处理求Fibonacci数列问题
- <netty权威指南>笔记-以回车换行结尾的消息如何处理半包问题
- 从重采样到数据合成:如何处理机器学习中的不平衡分类问题?
- 高手分享:快速处理IE如何打开网页的问题——认证系统
- 如何解决delphi2007中UTF-8转码的奇数汉字出错的问题
- 如何处理Oledb中EXCEL驱动读取EXCEL文件中字段长度大于255字符时出现的"数据截断"问题.
- oracle在win7或win10的vs2010及2015无法连接的问题如何处理
- 抓取网页中的内容、如何解决乱码问题、如何解决登录问题以及对所采集的数据进行处理显示的过程
- 如何处理Dpm备份时"副本内容不一致"的问题
- 【jiasuba】如何简单处理电脑无声问题
- Java如何处理多线程的数据同步问题