为什么 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。
所有,我正在尝试创建一个 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。