将 Varchar 转换为 Ascii

Posted

技术标签:

【中文标题】将 Varchar 转换为 Ascii【英文标题】:Convert Varchar to Ascii 【发布时间】:2010-12-20 17:34:03 【问题描述】:

我正在尝试将 VARCHAR 字段的内容转换为可以被第 3 方轻松引用的唯一数字。

如何将 varchar 转换为等效的 ascii 字符串?在 TSQL 中? ASCII() 函数转换单个字符,但我可以做些什么来转换整个字符串?

我尝试过使用

CAST(ISNULL(ASCII(Substring(RTRIM(LTRIM(PrimaryContactRegion)),1,1)),'')AS VARCHAR(3))
+ CAST(ISNULL(ASCII(Substring(RTRIM(LTRIM(PrimaryContactRegion)),2,1)),'')AS VARCHAR(3))

....但这很乏味,看起来很愚蠢,而且如果我的字符串很长,那就真的不行了。或者如果更好,我将如何在 s-s-rS 中做同样的事情?

【问题讨论】:

要转换的字符串可能有多长?任何超过 3 个字符的内容都会很快变得非常丑陋。 当然足够长,我需要寻找不同的东西。我有几个 30 个字符串。 这最多只能作为递归限制 100。如果你有一个超过100的字符串,它会在达到限制后停止执行 【参考方案1】:

试试这样的:

DECLARE @YourString   varchar(500)

SELECT @YourString='Hello World!'

;WITH AllNumbers AS
(
    SELECT 1 AS Number
    UNION ALL
    SELECT Number+1
        FROM AllNumbers
        WHERE Number<LEN(@YourString)
)
SELECT
       (SELECT
            ASCII(SUBSTRING(@YourString,Number,1))
            FROM AllNumbers
            ORDER BY Number
            FOR XML PATH(''), TYPE
       ).value('.','varchar(max)') AS NewValue
       --OPTION (MAXRECURSION 500) --<<needed if you have a string longer than 100

输出:

NewValue
---------------------------------------
72101108108111328711111410810033

(1 row(s) affected)

只是为了测试一下:

;WITH AllNumbers AS
(
    SELECT 1 AS Number
    UNION ALL
    SELECT Number+1
        FROM AllNumbers
        WHERE Number<LEN(@YourString)
)
SELECT SUBSTRING(@YourString,Number,1),ASCII(SUBSTRING(@YourString,Number,1)),* FROM AllNumbers

输出:

                 Number
---- ----------- -----------
H    72          1
e    101         2
l    108         3
l    108         4
o    111         5
     32          6
W    87          7
o    111         8
r    114         9
l    108         10
d    100         11
!    33          12

(12 row(s) affected)

另外,你可能想使用这个:

RIGHT('000'+CONVERT(varchar(max),ASCII(SUBSTRING(@YourString,Number,1))),3)

将所有 ASCII 值强制为 3 位,根据您的使用情况,我不确定这是否有必要。

每个字符使用 3 位输出:

NewValue
-------------------------------------
072101108108111032087111114108100033

(1 row(s) affected)

【讨论】:

如果有人将此代码与可能包含尾随空格的字符串一起使用,我建议将 LEN() 函数的所有用法替换为 DATALENGTH() 这太棒了。如果有必要,我做了一个小改动,让它更容易阅读。 RIGHT('000'+CONVERT(varchar(max),ASCII(SUBSTRING(@YourString,Number,1))),3) + ', '【参考方案2】:

好吧,我认为解决这个问题会很慢,但我想你可以这样做:

DECLARE @count INT, @string VARCHAR(100), @ascii VARCHAR(MAX)

SET @count = 1
SET @string = 'put your string here'
SET @ascii = ''

WHILE @count <= DATALENGTH(@string)
BEGIN
    SELECT @ascii = @ascii + '&#' + ASCII(SUBSTRING(@string, @count, 1)) + ';'
    SET @count = @count + 1
END

SET @ascii = LEFT(@ascii,LEN(@ascii)-1)
SELECT @ascii

我不在带有数据库引擎的电脑上,所以我无法真正测试这段代码。如果可行,那么您可以基于此创建 UDF。

【讨论】:

您需要围绕主 SELECT 语句的 ASCII 部分使用 CAST 或 CONVERT 语句才能使此解决方案正常工作,例如CAST(ASCII(SUBSTRING(@string, @count, 1)) AS VARCHAR)

以上是关于将 Varchar 转换为 Ascii的主要内容,如果未能解决你的问题,请参考以下文章

将 Varchar 转换为 NVarchar?

将日期(varchar)和时间(varchar)转换为日期时间Oracle

将 varchar 转换为 smallint 时出现转换错误

将文本转换为 varchar

将 VARCHAR 转换为 BIGINT

完全按原样将 Datetime 转换为 Varchar