含波兰字符的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
相关产品推荐
相关产品推荐

