我有一个数据导入过程,可以将 csv 文件中的数据导入到 SQL Server 中的表中。
我注意到某些列包含一些重音字符。
例如,我注意到数据库表中的以下文本
咖啡厅
我在 Notepad++ 中打开一个新文件,将编码更改为 ANSI 并使用上述文本保存文件。
然后将编码更改为UTF-8
结果是:
咖啡厅
我不确定出了什么问题。但是有什么办法可以解决数据库表中的这个问题吗?
我想在数据库表中显示相同的 CAFÉ 而不是 CAF
因为当此列显示在网站上时,即使网页上的编码为 UTF-*,它仍然将字符串显示为 CAFÉ 而不是 CAFÉ。
我还检查了列的排序规则类型:
SQL_Latin1_General_CP1_CI_AS
谢谢,
我有一个类似的问题,我通过将文件(在我的例子中是一个sql脚本)从UTF-8转换为ANSI来解决它,因为SQL Server不识别UTF-8编码。它对我有用,因为我只需要 ANSI 字符。
基于 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中测试过
我遇到了同样的问题,并结束使用集成工具将表导出到 MySQL 并运行以下查询:
UPDATE myTable Set thefield= CONVERT(BINARY CONVERT(thefieldUSING latin1) USING utf8);
这是我能够解决这个问题的唯一方法。
我想出了一个解决方案,通过在该网站上创建预期字符和实际字符之间的映射表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;
我最后使用 Notepad++ 转换了要导入的文件(编码 -> 转换为 UTF-8)。 SSIS 根本不起作用(MSSQL 2017)