Почему функция T sql Char() возвращает значения, отличные от указанных на asciitable.com

Все, я пытаюсь создать скалярную функцию T sql, которая удаляет любые расширенные символы ascii в переданном строковом значении. Я делаю это с помощью функции PatIndex(), как показано ниже. Одна вещь, которую я заметил, это то, что T sql Char() и функции ascii() возвращают другое символьное/десятичное значение при вызове с правильными входными данными из того, что указано в asciitable.com. Любая идея, почему это отличается? Сопоставление, используемое в базе данных (Sql server 2012), — SQL_Latin1_General_CP1_CI_AS.

Я использую этот URL-адрес для копирования и вставки расширенных символов ASCII http://www.rapidtables.com/code/text/ascii-table.htm

SELECT
  ASCII('Ñ') AS tsql_decimal_value,
  165 AS value_from_ascii_table


SELECT
  CHAR(165) AS tsql_value,
  'Ñ' AS value_from_asciitable

Моя функция Tsql

CREATE FUNCTION dbo.udf_Remove_NON_ASCII_characters (@value AS nvarchar(2000))
RETURNS varchar(2000)
AS
BEGIN

  DECLARE @incorrectcharLoc smallint --Position of bad character
  DECLARE @pattern varchar(140)  --Bad characters to look for

  SELECT
    @pattern = '%[' + CHAR(128) + .... + CHAR(255) + ']%'

  SELECT
    @incorrectcharLoc = PATINDEX(@pattern, @value)

  WHILE @incorrectcharLoc > 0
  BEGIN
    SELECT
      @value = STUFF(@value, @IncorrectcharLoc, 1, '')
    SELECT
      @IncorrectcharLoc = PATINDEX(@Pattern, @value)
  END
  RETURN @value
END

См. прикрепленный снимок экрана для наборов результатов сервера sqlвведите описание изображения здесь Будем очень признательны за любую помощь


person Rennish Joseph    schedule 25.09.2016    source источник
comment
Не дома, но проверьте, что происходит со значениями NVARCHAR. Вы уверены, что стандартные наборы ASCII действительно имеют это значение? Вы всегда можете использовать ASCII(), чтобы проверить, что распознает SQL. Примечание: стандартный набор можно найти здесь: Таблица ASCII   -  person clifton_h    schedule 26.09.2016
comment
@clifton_h, nvarchar возвращает тот же код ascii() для расширенного кода ascii Ñ. Да, это взято с asciitable.com (та же ссылка, которую вы упомянули)   -  person Rennish Joseph    schedule 26.09.2016


Ответы (1)


Добравшись до своего компьютера, я сначала проверил документацию по CHAR() и ASCII().

CHAR() возвращает код символа INT ASCII.

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

С этими предположениями и для забавы, используя букву ñ, я выполнил следующее утверждение:

SELECT  UPPER('ñ') AS Character         -- returns Ñ
      , ASCII( UPPER('ñ') ) ASCII_Value -- returns 209
      , CHAR( ASCII( UPPER('ñ') ) )     -- returns Ñ
      , CHAR(165) AS CHAR_VALUE2        -- returns ¥

Обратите внимание, что код ASCII для значения Ñ равен 209, а не 165. Также обратите внимание, что существуют разные неофициальные версии, в которых указаны коды ASCII, например ASCII-code.com, где Ñ не указан в первых 200 значения INT. Беда в неофициальных источниках.

Следовательно, мы можем сделать вывод:

  • A) Интернет-источники всегда следует воспринимать с некоторой долей скептицизма, особенно если они не являются официально санкционированной документацией (Я заметил на своем компьютере, что исходный источник был просто изображением, а не таблицей)
  • Б) В таблице ASCII нет Ñ в первых 200 значениях INT.

Одним из решений может быть создание собственного сопоставления таблиц ASCII и ссылка на него. Что бы вы ни выбрали, SQL Server использует реализацию стандарта ISO ASCII, поэтому вы можете сделать SQL SOT для решения этих проблем.

person clifton_h    schedule 26.09.2016
comment
, спасибо за разъяснение. Я строил свое собственное сопоставление на основе тех же встроенных в t sql функций, которые вы указали. Спасибо, что приложили усилия, чтобы изучить это. - person Rennish Joseph; 26.09.2016