我在 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,但我不知道什么时候。
有人知道什么是追加以及为什么? 预先感谢您的回复。
问题是您假设文字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' ');