You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含波兰字符的XML文件SQL导入失败问题求助

解决SQL Server导入含波兰字符UTF-8 XML的问题

问题根源

你的脚本中使用SINGLE_CLOB读取UTF-8 XML文件,SINGLE_CLOB会将文件内容按数据库默认代码页解析,而非UTF-8,导致波兰特殊字符(如ą、ę、ł、ń、ś、ć、ź、ż)被错误转换,最终插入时出现乱码或丢失。手动INSERT正常是因为直接传入了Unicode字符串,绕过了文件读取的编码问题。

解决方案

方案1:改用SINGLE_NCLOB读取文件(推荐)

SINGLE_NCLOB会直接以Unicode格式读取文件内容,返回NVARCHAR(MAX)类型,无需额外转换,完美保留UTF-8编码的特殊字符。修改脚本中读取XML的部分:

USE db_name

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;

DECLARE @xml NVARCHAR(MAX);

-- 替换SINGLE_CLOB为SINGLE_NCLOB,直接读取为Unicode
SELECT @xml = BulkColumn
FROM OPENROWSET(BULK 'path to xml file', SINGLE_NCLOB) AS x;

DECLARE @hDoc INT;

EXEC sp_xml_preparedocument @hDoc OUTPUT, @xml;

INSERT INTO mytable (column)
SELECT 
    z.column
FROM OPENXML(@hDoc, '/root/people/person', 2)
WITH (
    column NVARCHAR(50) 'column'  -- 确保此处节点名称与XML中实际节点一致
) AS z;

EXEC sp_xml_removedocument @hDoc;

方案2:指定UTF-8排序规则转换(适用于SQL Server 2019+)

如果因环境限制无法使用SINGLE_NCLOB,可以通过指定UTF-8排序规则,将SINGLE_CLOB读取的内容正确转换为Unicode:

SELECT @xml = CONVERT(NVARCHAR(MAX), BulkColumn COLLATE Latin1_General_100_CI_AS_SC_UTF8)
FROM OPENROWSET(BULK 'path to xml file', SINGLE_CLOB) AS x;

额外检查项

  • 确认XML文件开头的编码声明正确:<?xml version="1.0" encoding="UTF-8"?>,sp_xml_preparedocument会依据此声明解析编码,但前提是文件内容未被错误转换。
  • 确保目标表的字段类型确实为NVARCHAR(而非VARCHAR),避免插入时再次丢失Unicode信息。

内容的提问来源于stack exchange,提问作者user27952732

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:30:59