如何使用OPENROWSET BULK选项将含原生字符(如ধামুরা বন্দর)的UTF-8格式JSON文件导入SQL Server并解决乱码问题
解决UTF-8 JSON文件导入SQL Server时孟加拉语字符乱码问题
这是因为你用SINGLE_BLOB读取后直接赋值给VARCHAR(MAX),数据库会用默认代码页(非UTF-8)转换二进制内容,导致非ASCII字符乱码。而直接用N前缀赋值正常,是因为N前缀强制字符串以UTF-16(SQL Server的NVARCHAR原生编码)存储,跳过了错误的编码转换。
正确的解决方案
用SINGLE_BLOB读取原始二进制内容,再通过CONVERT函数指定UTF-8编码(代码页65001)转换为NVARCHAR(MAX),就能正确解析孟加拉语字符:
DECLARE @KettleFeed NVARCHAR(MAX) SELECT @KettleFeed = CONVERT(NVARCHAR(MAX), BulkColumn, 65001) FROM OPENROWSET(BULK 'D:\Json_Samples\Test.json', SINGLE_BLOB) Json SELECT * FROM OPENJSON(@KettleFeed, '$') WITH( NativeName NVARCHAR(100) N'$.NativeName' )
为什么这个方法有效?
SINGLE_BLOB会读取文件的原始二进制数据,不做任何自动编码转换,避免了默认代码页的干扰。CONVERT(NVARCHAR(MAX), BulkColumn, 65001)明确告诉SQL Server用UTF-8编码解析二进制内容,转换成NVARCHAR支持的UTF-16格式,确保孟加拉语原生字符被正确识别。
关于SINGLE_NCLOB的说明
SINGLE_NCLOB要求文件是UTF-16LE(Unicode)格式,而你的文件是UTF-8,所以不需要强行转换文件格式——用上面的方法直接处理UTF-8文件更高效。
内容的提问来源于stack exchange,提问作者Bob's gaming
相关产品推荐
相关产品推荐

