开发者

when if i send Arabic characters means sql considering as 'question mark' why?

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 (AS开发者_JAVA百科CII(@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] ('ش')

it was showing ouput As "E"

so i have checked up like this manner

select ascii('ش')

it was given output as 63

63 is nothng but ascii value for Question mark '?"


Try using UNICODE() instead of ASCII(), because you're dealing with unicode characters.

ASCII():

Returns the ASCII code value of the leftmost character of a character expression.

UNICODE():

Returns the integer value, as defined by the Unicode standard, for the first character of the input expression.

Note, to run a test:

-- 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'ش')

Update: A few things you need to change:

declare @thisChar char(1);

should be:

declare @thisChar nchar(1);

Then when you check that character, just do a straight swap from using ASCII() to UNICODE()

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜