我有一个转换UTF8字符的功能.当我使用字符串调用函数时,它按预期工作.
select dbo.fn_PolskieZnaki_utf8('Kraków')
回到克拉科夫
但是,当我从表中选择一列时,它不起作用.它返回Kraków.怎么了?
use MyDataBase
GO
select dbo.fn_PolskieZnaki_utf8(MyColumn)
from MyTable
这是函数本身:
CREATE FUNCTION [dbo].[fn_PolskieZnaki_utf8](@string NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
begin
RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
(@string,
'Ä,,', N'Ą'),
'Ä...', N'ą'),
'Ć', N'Ć'),
'ć', N'ć'),
'Ę', N'Ę'),
'Ä™', N'ę'),
'Å', N'Ł'),
'Å,', N'ł'),
'Ń', N'Ń'),
'Å„', N'ń'),
'Ã"', N'Ó'),
'ó', N'ó'),
'Åš', N'Ś'),
'Å›', N'ś'),
'Ź', N'Ź'),
'Å°', N'ź'),
'Å»', N'Ż'),
'ż', N'ż')
end
最佳答案 这可能是因为您表中列的
collation.
检查此示例查询.
DECLARE @table table(c varchar(50) collate SQL_Polish_Cp1250_CI_AS )
insert into @table values(N'Kraków')
DECLARE @table2 table(c varchar(50) collate SQL_Latin1_General_Cp1_CS_AS )
insert into @table2 values(N'Kraków')
select dbo.fn_PolskieZnaki_utf8('Kraków'),dbo.fn_PolskieZnaki_utf8(c) from @table
select dbo.fn_PolskieZnaki_utf8('Kraków'),dbo.fn_PolskieZnaki_utf8(c) from @table2
输出:
Kraków KrakA3w
Kraków Kraków
编辑
除了上述内容之外,在使用REPLACE时的函数中,在搜索字符’Ä,,’,N’Ą’之前缺少N.它应该像N’Ä,,’,N’Ą’).
更新的功能将如下所示.
ALTER FUNCTION [dbo].[fn_PolskieZnaki_utf8](@string NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
begin
RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE
(@string,
N'Ä,,', N'Ą'),
N'Ä...', N'ą'),
N'Ć', N'Ć'),
N'ć', N'ć'),
N'Ę', N'Ę'),
N'Ä™', N'ę'),
N'Å', N'Ł'),
N'Å,', N'ł'),
N'Ń', N'Ń'),
N'Å„', N'ń'),
N'Ã"', N'Ó'),
N'ó', N'ó'),
N'Åš', N'Ś'),
N'Å›', N'ś'),
N'Ź', N'Ź'),
N'Å°', N'ź'),
N'Å»', N'Ż'),
N'ż', N'ż')
end
其他链接: