日期:2014-05-18  浏览次数:20664 次

关于sqlserver字段中文+英文的问题
如果一个字段是varchar(50)

现有一堆不规整数据想转入,只取   left(str,50)
然后发现如果含有中文left取到的是50个中文字,那么存进去要100字节,就转不进去
如果只取left(str,25)那么对于英文数据来讲,就少了一半
我发现用ascii(str)> 128判断,只能判断第一个字符是不是英文如果是 'aA '这样的数据就没办法了

对于这个,我应该怎么做好呢?

------解决方案--------------------
你就定義最大的 varcahr(100)
------解决方案--------------------
楼主看一下这两个的用法,应该对你有帮助
select len( 'aA ')
select length( 'aA ')
------解决方案--------------------
其实你也不用,直接如果是varchar(50),直接插入的话就会拿右边50位的了
如:
declare @a varchar(10)
set @a= '本世32dg地f '
select @a
结果就是

----------
本世32dg地

(所影响的行数为 1 行)

------解决方案--------------------
用 nvarchar(50) 就可以了
------解决方案--------------------
方法一(简单):将字段数据类型改为nvarchar

方法二(麻烦):通过一个自定义函数截断字符串
create function f_str(@stri varchar(20))
returns varchar(10)
as
begin
declare @i int,
@l int,
@stro varchar(10)

set @i = 1
set @l = 0

while @l <= 8
begin
set @l = @l + case when ascii(substring(@stri, @i, 1)) <= 128 then 1 else 2 end
set @stro = isnull(@stro, ' ') + substring(@stri, @i, 1)
set @i = @i + 1
end

if(@l = 9 and ascii(substring(@stri, @i, 1)) <= 128)
select @stro = @stro + substring(@stri, @i, 1)

return @stro
end

/*测试:

select dbo.f_str( 'sa模压地1中 '), dbo.f_str( 'sa模压地14 ')
---------- ----------
sa模压地1 sa模压地14

(所影响的行数为 1 行)
*/