2016-05-19 4 views
1

Я знаю, что ASCII (без расширения) не понимает, не являющихся английских символов, но почему, когда я кладу это:Почему функция ASCII T-SQL возвращает число при использовании неанглийских символов?

SELECT ASCII('Ñ') 

Функция возвращает 209. Является ли это с помощью расширения, или то, что это происходит? Спасибо за ответ заранее.

+1

Большое количество использования термина «ASCII» просто неправильно. Хотя можно не захотеть переименовать функции или ввести новые, по крайней мере, документация должна быть обновлена! Слишком часто ASCII является символьным кодом, поскольку Kleenex относится к лицевой ткани. Это было бы в этом списке [обобщенных товарных знаков] (https://en.wikipedia.org/wiki/List_of_generic_and_genericized_trademarks), если это товарный знак. –

ответ

1

номер ACP значения кода Ñлатинской буква N капитала с Tilde действительна для любого из ACP1250, ACP1252, ACP1254, ACP1257 и ACP1258encodings (см дополнить ниже).

Читать MSDN ссылка (относится к: SQL Server, начиная с 2008 года):

ASCII (Transact-SQL) Возвращает значение кода ASCII из крайнего левого символа символьного выражения.

Это немного сжато, но это краткое и точный , а? Я так не думаю: изначально на основе английского алфавита ASCII кодирует указанных символов в семь-бит целые числа, как показано the ASCII chart. Однако номер, возвращенный с ASCII('Ñ') является восемь бит целое число, по-видимому.

На самом деле функция ASCII возвращает ACP значение кода из крайнего левого символа символьного выражения (см ACP: Acronym for the Windows (ANSI) code page in use.)
Для доказательства, давайте использовать следующий эффект: the ASCII function is the opposite of the CHAR function в SQL Server (Transact -SQL). Ссылка MSDN говорит немного больше об этом:

CHAR (Transact-SQL) Преобразует INT код ASCII персонажу.

Синтаксис

CHAR (integer_expression) 

Аргументы

integer_expression Является целым числом от 0 до 255. NULL возвращает , если целочисленное выражение отсутствует в этом диапазоне.

Кстати, все это расхождение происходит от печально известной терминологию путаницы, т.е. щедро неправильное использование (перестановка) терминов, как ASCII, ANSI, CP или даже такие термины, как UNICODE, UTF-16, UCS-2 и т.д. и т.п.

Дополнение: Windows ANSI таблица символов для кода (таблица ниже прибывает из моего маленького .bat сценария):

ACP  Hex codepoint #Description 
---  --- --------- ------------ 
CP1250 0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE 
CP1251 0xD1 0x0421 #CYRILLIC CAPITAL LETTER ES 
CP1252 0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE 
CP1253 0xD1 0x03A1 #GREEK CAPITAL LETTER RHO 
CP1254 0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE 
CP1255 0xD1 0x05C1 #HEBREW POINT SHIN DOT 
CP1256 0xD1 0x0631 #ARABIC LETTER REH 
CP1257 0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE 
CP1258 0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE