为什么 T sql Char() 函数 returns 的值与 asciitable.com 上指定的值不同

Why T sql Char() function returns values diffrent from whats specified on asciitable.com

所有,我正在尝试创建一个 T sql 标量函数,它删除传入字符串中的任何扩展 ascii 字符 value.I 我正在使用 PatIndex() 函数作为 below.One 我注意到的是 T sql Char() 和 ascii() 函数 return 一个不同的 character/decimal 值,当使用 [=28= 中提到的正确输入调用时] 。知道为什么这是不同的吗?数据库(Sql 服务器 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 服务器结果集 屏幕截图 任何帮助将不胜感激

到达我自己的计算机后,我首先查看了有关 CHAR() 和 ASCII() 的文档。

CHAR() returns an INT ASCII character code

ASCII() returns the ASCII code value of the leftmost character of a character expression

基于这些前提和使用字母 ñ 的踢球,我 运行 以下声明:

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) 应始终对在线资源持怀疑态度,特别是如果它们不是官方认可的文档(我在我的计算机上注意到原始资源只是一张图片,而不是table)
  • B) ASCII table 在前 200 个 INT 值中没有 Ñ。

一个解决方案可能是构建您自己的 ASCII table 映射并引用它。无论您选择什么,SQL 服务器都使用 ISO ASCII 标准的实现,因此您不妨将这些问题设为 SQL SOT。