когда, если я отправляю арабские символы, значит sql рассматривает как «вопросительный знак», почему? - PullRequest
1 голос
/ 21 апреля 2011
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 - это не что иное, как значение ascii для вопросительного знака '? "

1 Ответ

2 голосов
/ 21 апреля 2011

Попробуйте использовать 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 ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...