OPENJSON读取JSON文件时Unicode字符乱码问题求助
解决OPENROWSET读取JSON时的Unicode乱码问题
问题原因
你遇到的乱码是因为使用 SINGLE_CLOB 参数读取UTF-8编码的JSON文件导致的:SINGLE_CLOB 默认将文件按ANSI编码解析,无法正确识别UTF-8格式的非ASCII Unicode字符,最终造成字符显示错乱。
解决方案1:使用SINGLE_NCLOB直接读取Unicode数据
将OPENROWSET中的SINGLE_CLOB替换为SINGLE_NCLOB,它会以Unicode(UTF-16)格式读取文件,完整保留原JSON中的特殊字符:
SELECT c.* FROM OPENROWSET (BULK N'C:\countries-states-cities-database-master\countries.json', SINGLE_NCLOB) as j CROSS APPLY OPENJSON(BulkColumn) WITH ( id int , name nvarchar(256), iso3 char(3), numeric_code INT, iso2 char(2), phonecode nvarchar(256), capital nvarchar(256), currency nvarchar(255), currency_name nvarchar(255), currency_symbol nvarchar(255), tld nvarchar(255), native nvarchar(255), region nvarchar(255), subregion nvarchar(255), timezones nvarchar(max), translations nvarchar(max), latitude decimal(10,8), longitude decimal(11,8), emoji nvarchar(191), emojiU nvarchar(191), created_at datetime, updated_at datetime, flag INT, wikiDataId nvarchar(255) ) AS c
解决方案2:通过编码转换处理UTF-8文件(SQL Server 2016+)
如果需要兼容特定场景,也可以保留SINGLE_CLOB,但将读取的字节流通过CONVERT函数按UTF-8编码(代码页65001)转换为NVARCHAR(MAX):
SELECT c.* FROM OPENROWSET (BULK N'C:\countries-states-cities-database-master\countries.json', SINGLE_CLOB) as j CROSS APPLY OPENJSON(CONVERT(NVARCHAR(MAX), j.BulkColumn, 65001)) WITH ( id int , name nvarchar(256), iso3 char(3), numeric_code INT, iso2 char(2), phonecode nvarchar(256), capital nvarchar(256), currency nvarchar(255), currency_name nvarchar(255), currency_symbol nvarchar(255), tld nvarchar(255), native nvarchar(255), region nvarchar(255), subregion nvarchar(255), timezones nvarchar(max), translations nvarchar(max), latitude decimal(10,8), longitude decimal(11,8), emoji nvarchar(191), emojiU nvarchar(191), created_at datetime, updated_at datetime, flag INT, wikiDataId nvarchar(255) ) AS c
内容的提问来源于stack exchange,提问作者Imran Qadir Baksh - Baloch
相关产品推荐
相关产品推荐

