4

I have a function for converting UTF8 characters. When I call the function using string it works as expected.

select dbo.fn_PolskieZnaki_utf8('Kraków')

returns Kraków

But when I select a column from the table it does not work. It returns Kraków. What is wrong?

use MyDataBase 
GO
select dbo.fn_PolskieZnaki_utf8(MyColumn)
from MyTable

Here is the function itself:

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
Przemyslaw Remin
  • 6,276
  • 25
  • 113
  • 191

2 Answers2

2

This may be because of collation of the column in your table.

Check this Sample Query.

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

Output:

Kraków  KrakA3w

Kraków  Kraków

EDIT In addition to the above, In your function when using REPLACE you are missing N before the search character 'Ä,,', N'Ą'). It should be like this N'Ä,,', N'Ą').

The updated function will look like this.

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

Additional Links:

COLLATE

Find Collation of Database and Table

What is the meaning of the prefix N in T-SQL statements?

Community
  • 1
  • 1
ughai
  • 9,830
  • 3
  • 29
  • 47
0

Finally this function worked for me. I have changed the characters. N before the character is necessary. The collate turned out not to be necessary. In comments I give some Polish cities using those bushy characters.

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'Ą'),  --RUDA ŚLÄ„SKA
N'Ä…',   N'ą'),  --ŚlÄ…skie  
N'Ć',   N'Ć'),  --ZAMOŚĆ
N'ć',   N'ć'),  --Zamość
N'Ä',    N'Ę'),  --ŁÄCZNA
N'Ę™',   N'ę'),  --Ostrowiec ŚwiĘ™tokrzyski
N'Ĺ',    N'Ł'),  --BIAĹA PODLASKA
N'Ĺ‚',   N'ł'),  --MirosĹ‚awiec
N'Ĺ',    N'Ń'),  --POZNAĹ
N'Ĺ„',   N'ń'),  --PoznaĹ„
N'Ă“',   N'Ó'),  --PIWNICZNA-ZDRĂ“J
N'Ăł',   N'ó'),  --Piwniczna-ZdrĂłj
N'Ĺš',   N'Ś'),  --ĹšlÄ…skie
N'Ĺ›',   N'ś'),  --DolnoĹ›ląskie
N'Ĺą',   N'Ź'),  --CZELADĹą
N'Ĺş',   N'ź'),  --ŁódĹş
N'Ĺ»',   N'Ż'),  --CHODZIEĹ»
N'ĹĽ',   N'ż')   --ŁomĹĽa
end
Przemyslaw Remin
  • 6,276
  • 25
  • 113
  • 191