【问题标题】:Why T sql Char() function returns values diffrent from whats specified on asciitable.com为什么 T sql Char() 函数返回的值与 asciitable.com 上指定的值不同
【发布时间】:2016-09-25 21:30:39
【问题描述】:

所有,我正在尝试创建一个 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 server 结果集截图 任何帮助将不胜感激

【问题讨论】:

  • 不在家,但请检查 NVARCHAR 值会发生什么。你确定标准的 ASCII 集实际上有这个值吗?您始终可以使用 ASCII() 来验证 SQL 识别的内容。注意:可以在此处找到标准集:ASCII Table
  • @clifton_h ,nvarchar 为 Ñ 扩展的 ascii 代码返回相同的 ascii() 代码。是的,这取自 asciitable.com(您提到的相同链接)

标签: sql-server extended-ascii


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

一种解决方案可能是构建您自己的 ASCII 表映射并引用它。无论您选择什么,SQL Server 都使用 ISO ASCII 标准的实现,因此您不妨让 SQL 成为解决这些问题的 SOT。

【讨论】:

  • ,感谢您的澄清。我正在根据您指定的相同 t sql 内置函数构建自己的映射。感谢您努力研究它
猜你喜欢
  • 2020-04-28
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 2021-05-04
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多