如果我发送阿拉伯字符意味着sql考虑为'问号'为什么?

时间:2011-04-21 07:33:22

标签: sql-server sql-server-2005

ALTER FUNCTION [dbo].[Contains_Arabic_English_Char] ( @RowStr nvarchar(1000) ) 
RETURNS Char 
AS

BEGIN

declare @index int;
declare @charac char(1);
SELECT @index = 0;
declare @thisChar char(1);
while(@index <= LEN(@RowStr))
begin
 SELECT @thisChar = SUBSTRING(@RowStr,@index,1);

-- print @index
-- print ASCII(@thisChar) 
if (ASCII(@thisChar) BETWEEN 153 and 158 OR ASCII(@thisChar) BETWEEN 162 and 218 OR                                           ASCII(@thisChar) BETWEEN 223 and 254 )
--if (unicode(@thisChar) BETWEEN U+0600 and U+06FF)

begin SELECT @index=-1; 
BREAK;
 end 
else 
SELECT @index=@index+1; 
end 
-- print @index 
-- print LEN(@rowStr)
if (@index =-1)
BEGIN
SET @charac = 'A' --''found a Arabic char!'
END 
ELSE
BEGIN 
SET @charac = 'E' --'no Arabic Char found!' END

RETURN @charac

END

EXEC select [dbo].[Contains_Arabic_English_Char] ('ش')

显示输出为“E”

所以我已经像这样检查了

选择ascii('ش')

输出为63

63是nothng但是问号的'ascii值'?“

1 个答案:

答案 0 :(得分:2)

尝试使用UNICODE()而不是ASCII(),因为你正在处理unicode字符。

<强> ASCII():

  

返回的ASCII码值   角色最左边的角色   表达

<强> UNICODE()

  

返回定义的整数值   按照Unicode标准,第一个   输入表达式的字符。

注意,要运行测试:

-- Returns 63:
select ASCII('ش')
-- Still returns 63:
select UNICODE('ش')
-- Returns 1588. Note the N before the character, to indicate it's a unicode string
select UNICODE(N'ش')

<强>更新 您需要改变一些事项:

declare @thisChar char(1);

应该是:

declare @thisChar nchar(1);

然后当你检查那个字符时,只需要使用ASCII()直接交换到UNICODE()