使用BULK INSERT导入CSV时希伯来文显示乱码问题求助
解决BULK INSERT导入希伯来文到SQL Server nvarchar字段乱码的问题
我帮你梳理下问题根源,然后给出针对性的解决方案:
问题核心原因
你遇到的乱码本质是BULK INSERT默认以单字节编码读取文件,但希伯来文属于Unicode字符,需要双字节(UTF-16)或UTF-8编码才能正确识别,这和nvarchar字段的存储格式不匹配。而INSERT语句正常是因为它隐式处理了Unicode字符串,但BULK INSERT是直接读取文件字节流,没有自动适配Unicode编码。另外你尝试加N'前缀是误区——这个前缀只对T-SQL里的字符串常量有效,BULK INSERT会把它当成文件内容的一部分存入,所以才会出现N'乱码'的奇怪结果。
可行解决方案
根据你的CSV文件编码类型,选择以下两种方案之一:
方案1:CSV保存为UTF-16(Unicode)编码时使用
修改BULK INSERT语句,添加DATAFILETYPE = 'widechar'参数,明确告诉SQL Server文件是Unicode(UTF-16)格式:
BULK INSERT [dbo].[SomeTable] FROM 'C:\Desktop\csvfilesaved.csv' WITH ( FIRSTROW = 2, FIELDTERMINATOR = '|', ROWTERMINATOR = '\n', ERRORFILE = 'C:\Desktop\Error.csv', TABLOCK, DATAFILETYPE = 'widechar' -- 关键参数:指定文件为Unicode格式 )
小提示:要确保CSV是UTF-16编码保存。可以用记事本打开文件,点击「文件」→「另存为」,在编码下拉框选「Unicode」(对应UTF-16 LE),然后覆盖保存。
方案2:CSV保存为UTF-8编码时使用(SQL Server 2017及以上版本支持)
如果你的SQL Server是2017或更高版本,支持直接读取UTF-8文件,添加CODEPAGE = '65001'参数即可:
BULK INSERT [dbo].[SomeTable] FROM 'C:\Desktop\csvfilesaved.csv' WITH ( FIRSTROW = 2, FIELDTERMINATOR = '|', ROWTERMINATOR = '\n', ERRORFILE = 'C:\Desktop\Error.csv', TABLOCK, CODEPAGE = '65001' -- 指定文件为UTF-8编码 )
额外检查项
- 确认目标表的字段确实是
nvarchar类型(不是varchar),如果是varchar,哪怕编码正确也会出现乱码。 - 如果Windows环境下读取时出现行识别异常,可以尝试把
ROWTERMINATOR = '\n'改成ROWTERMINATOR = '\r\n',适配Windows系统的换行格式。
内容的提问来源于stack exchange,提问作者Mithrandir
相关产品推荐
相关产品推荐

