为什么sql中指数为2的替换链会影响数字2?

问题描述 投票:0回答:1

我在 SQL Server 数据库中创建了一个 SQL 函数,用于规范化字符串以便进行比较和连接。 但我似乎有 SQL 不一致的情况,我想了解原因。 我的功能的实现是:

CREATE OR ALTER FUNCTION dbo.fnCleanStringStrict (@str NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    RETURN TRIM(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
            LOWER(@str),
        '؜', ''), '‎', ''), '‏', ''), '‪', ''), '‫', ''), '‬', ''), '‭', ''),
        '‮', ''), '⁦', ''), '⁧', ''), '⁨', ''), '⁩', ''), ' ', ' '), ' ', ' '), '­', ''),
        '͏', ''), 'ᅟ', ' ') ,'ᅠ', ' '), '឴', ''), '឵', ''), '᠋', ''), '᠌', ''), '᠍', ''), '᠎', ''), ' ', ' '), ' ', ' '), ' ', ' '),
        ' ', ' '), ' ', ' '), ' ', ' '), ' ', ' '), ' ', ' '), ' ', ' '), ' ', ' '), ' ', ' '), '​', ''), '‌', ''), '‍', ''),
        ' ', ' '), ' ', ' '), '⁠', ''), '⁡', ''), '⁢', ''), '⁣', ''), '⁤', ''), '', ''), '', ''), '', ''), '', ''), '', ''),
        '', ''), '⠀', ' '), ' ', ' '), 'ㅤ', ' '), '︀', ''), '︁', ''), '︂', ''), '︃', ''), '︄', ''), '︅', ''), '︆', ''), '︇', ''),
        '︈', ''), '︉', ''), '︊', ''), '︋', ''), '︌', ''), '︍', ''), '︎', ''), '️', ''), NCHAR(10), ' '), NCHAR(13), ' '), '', ''),
        'ᅠ', ' '), '', ''), '', ''), '', ''), NCHAR(9), ' '), '–', '-'), '‑', '-'), '¸', '.'), '·', '.'), '…', '...'),
        '’', ''''), '´', ''''), '‘', ''''), '’', ''''), '́', ''''), '`', ''''), '“', '"'), '”', ''), 'Á', 'a'), 'á', 'a'),
        'À', 'a'), 'à', 'a'), 'Â', 'a'), 'â', 'a'), 'Ä', 'a'), 'ä', 'a'), 'Ã', 'a'), 'ã', 'a'), 'Å', 'a'), 'å', 'a'), 'Æ', 'ae'),
        'æ', 'ae'), 'ß', 'b'), 'Č', 'c'), 'č', 'c'), 'Ç', 'c'), 'ç', 'c'), 'Ð', 'd'), 'ð', 'd'), 'É', 'e'), 'é', 'e'), 'È', 'e'),
        'è', 'e'), 'Ê', 'e'), 'ê', 'e'), 'Ë', 'e'), 'ë', 'e'), 'Í', 'i'), 'í', 'i'), 'Ì', 'i'), 'ì', 'i'), 'Î', 'i'), 'î', 'i'),
        'Ï', 'i'), 'ï', 'i'), 'Ñ', 'n'), 'ñ', 'n'), 'Ó', 'o'), 'ó', 'o'), 'Ò', 'o'), 'ò', 'o'), 'Ô', 'o'), 'ô', 'o'), 'Ö', 'o'),
        'ö', 'o'), 'Ō', 'o'), 'ō', 'o'), 'Õ', 'o'), 'õ', 'o'), 'Œ', 'oe'), 'œ', 'oe'), 'Ř', 'r'), 'ř', 'r'), 'Š', 's'), 'š', 's'),
        '™', 'tm'), 'Ú', 'u'), 'ú', 'u'), 'Ù', 'u'), 'ù', 'u'), 'Û', 'u'), 'û', 'u'), 'Ü', 'u'), 'ü', 'u'), '×', 'x'), 'Ý', 'y'),
        'ý', 'y'), 'Ÿ', 'y'), 'ÿ', 'y'), 'Ž', 'z'), 'ž', 'z'), '²', ' '), '', ' '), '-', ' '), '!', ' '), '"', ' '), '#', ' '),
        '$', ' '), '%', ' '), '&', ' '), '(', ' '), ')', ' '), '*', ' '), ',', ' '), '/', ' '), ':', ' '), ';', ' '), '?', ' '),
        '@', ' '), '[', ' '), '\', ' '), ']', ' '), '^', ' '), '_', ' '), '{', ' '), '|', ' '), '}', ' '), '~', ' '), '¨', ' '),
        '+', ' '), '<', ' '), '=', ' '), '>', ' '), '«', ' '), '»', ' '), '¢', ' '), '©', ' '), '®', ' '), '°', ' '), '•', ' '),
        '€', ' '), '¾', ' '), 'º', ' '), 'ø', ' '), 'þ', ' '), 'Þ', ' '), '''', ' '), '.', ' '), ' ', '<>'), '><', ''), '<>', ' '))
END
GO

当我提出这样的查询时:

SELECT dbo.fnCleanStringStrict('42, the answer is 42')

我得到回报

'4 , the answer is 4 '
代替
'42, the answer is 42'
。 我不明白为什么我的 2 被替换为
' '

我认为这可能是删除指数 2 的替换之一,事实上,当我在函数中删除

REPLACE( .......  ,'²', ' ')
的替换时,我得到了预期的
'42, the answer is 42'

所以很明显,但我尝试做

REPLACE('42, the answer is 42'  ,'²', ' ')
它返回
'42, the answer is 42'
,我也尝试将
LOWER
放在替换中并在内部和外部添加随机替换,但正如预期的那样,它不会改变我的字符串。

这似乎也不是由于编码问题,字符 2 和 ² 没有相同的代码或者是彼此的上/下。

似乎

REPLACE( ... ,'²', ' ')
在某些情况下会影响数字2,但我不知道什么时候。

有人知道什么是追加以及为什么? 预先感谢您的回复。

sql-server replace character-encoding
1个回答
0
投票

问题是您假设文字varchar

 (
''
) 例如不会导致数据丢失;你错了。因为实际上 ANSI 不支持您的许多字符,所以您想要替换的许多字符正在替换 
wrong 字符。您可以使用文字 nvarchar
 来解决这个问题。

但是,我必须承认,您的查询确实很混乱。最好用一张带有替换的桌子,然后进行一些“有趣”的字符串构建,但是你有一些异常值,例如

tm
 (并且错误地将 
ß
B
 而不是 
ss
) )。我尝试用 
TRANSLATE
 来整理其中的一些内容。对于要删除的字符,我将它们全部
TRANSLATE
删除为要删除的字符(
$
),然后
REPLACE
什么都不删除。这导致了一个更容易阅读的解决方案,但仍然不容易阅读:

DECLARE @str nvarchar(max) = N'42, thê Ànßwér îs 42' SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(TRANSLATE(TRANSLATE(@str,N'`´·¸ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿČčŌōŘřŠšŸŽž́‑–‘’’“', N'''''..aaaaaaceeeeiiiidnoooooxuuuuyaaaaaaceeeeiiiidnooooouuuuyyccoorrssyzz''--''''''"'), N'­͏؜឴឵᠋᠌᠍᠎​‌‍‎‏”‪‫‬‭‮⁠⁡⁢⁣⁤⁦⁧⁨⁩︀︁︂︃︄︅︆︇︈︉︊︋︌︍︎️', N'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'),'$',''), N'…',N'...'), N'Æ',N'ae'), N'æ',N'ae'), N'Œ',N'oe'), N'œ',N'oe'), N'™',N'tm'), N'ß',N'ss'), N' ', N'<>'), N'><', N''), N'<>', N' ');
    
© www.soinside.com 2019 - 2024. All rights reserved.