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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:05:33