如何将SQL Server表中的ANSII字符修复为UTF-8

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

我有一个数据导入过程,可以将 csv 文件中的数据导入到 SQL Server 中的表中。

我注意到某些列包含一些重音字符。

例如,我注意到数据库表中的以下文本

咖啡厅

我在 Notepad++ 中打开一个新文件,将编码更改为 ANSI 并使用上述文本保存文件。

然后将编码更改为UTF-8

结果是:

咖啡厅

我不确定出了什么问题。但是有什么办法可以解决数据库表中的这个问题吗?

我想在数据库表中显示相同的 CAFÉ 而不是 CAF

因为当此列显示在网站上时,即使网页上的编码为 UTF-*,它仍然将字符串显示为 CAFÉ 而不是 CAFÉ。

我还检查了列的排序规则类型:

SQL_Latin1_General_CP1_CI_AS

谢谢,

sql-server utf-8 non-unicode
5个回答
2
投票

我有一个类似的问题,我通过将文件(在我的例子中是一个sql脚本)从UTF-8转换为ANSI来解决它,因为SQL Server不识别UTF-8编码。它对我有用,因为我只需要 ANSI 字符。


2
投票

基于 SQL - UTF-8 到 varchar/nvarchar 编码问题:

创建自定义函数如下:

CREATE FUNCTION dbo.convert_utf8(@utf8 VARBINARY(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @rslt NVARCHAR(MAX);

    SELECT @rslt=
    CAST(
          --'<?xml version="1.0" encoding="UTF-8"?><![CDATA['
        + @utf8
        --']]>'
        
    AS XML).value('.', 'nvarchar(max)');

    RETURN @rslt;
END
GO

然后按如下方式更新损坏的字段:

update [my_table] set my_field = dbo.convert_utf8(cast(my_field as varbinary(MAX))) 

我在SQLServer 2019中测试过


1
投票

我遇到了同样的问题,并结束使用集成工具将表导出到 MySQL 并运行以下查询:

UPDATE myTable Set thefield= CONVERT(BINARY CONVERT(thefieldUSING latin1) USING utf8);

这是我能够解决这个问题的唯一方法。


1
投票

我想出了一个解决方案,通过在该网站上创建预期字符和实际字符之间的映射表http://www.i18nqa.com/debug/utf8-debug.html

一旦我有了映射表,就加入到我的原始表中,其中像实际字符一样,并将这些字符替换为预期的字符。

UPDATE rd
SET rd.Name = REPLACE(Name, m.Actual,m.Expected)
FROM RawData rd
INNER JOIN dbo.UtfMapping m ON  rd.Name LIKE '%'+m.Actual+'%' and LEN(m.Actual) = 3;

UPDATE rd
SET rd.Name = REPLACE(Name, m.Actual,m.Expected)
FROM RawData rd
INNER JOIN dbo.UtfMapping m ON  rd.Name LIKE '%'+m.Actual+'%' and LEN(m.Actual) = 2;

UPDATE rd
SET rd.Name = REPLACE(Name, m.Actual,m.Expected)
FROM RawData rd
INNER JOIN dbo.UtfMapping m ON  rd.Name LIKE '%'+m.Actual+'%' and LEN(m.Actual) = 1;

0
投票

我最后使用 Notepad++ 转换了要导入的文件(编码 -> 转换为 UTF-8)。 SSIS 根本不起作用(MSSQL 2017)

© www.soinside.com 2019 - 2024. All rights reserved.