SQL Server 2016 SP2执行BULK INSERT报“服务器不支持代码页65001”错误
问题根因
这个报错和你填写的文件路径是否存在、文件本身能不能被读取完全无关。只要你写的BULK INSERT语句里显式指定了CODEPAGE = '65001',SQL Server 2016 SP2会优先在语法解析阶段做版本能力校验,这一步的执行顺序早于文件路径校验、文件存在性检查,所以哪怕你填的是完全不存在的路径,也会先抛出代码页不支持的报错。
SQL Server 2016 SP2本身从内核层面就不支持BULK INSERT参数中指定代码页65001(即UTF-8编码)的配置。
注:BULK INSERT对代码页65001的原生支持,是从SQL Server 2017 CU3版本才正式推出的,2016及更早版本无论打多少累积更新补丁,都无法识别该参数值。
落地解决步骤
- 先检查当前执行的BULK INSERT脚本,找到并删掉所有带
CODEPAGE = '65001'的配置内容。绝大多数碰到这个问题的用户,都是直接照搬了SQL Server 2017及以上版本的导入模板——这类模板为了兼容无BOM的UTF-8文件,默认会带上65001的代码页参数,原封不动搬到2016环境必然触发报错。 - 你当前使用的UCS-2 LE BOM(带BOM的UTF-16 LE)格式源文件,SQL Server 2016可以原生识别这类Unicode编码内容,不需要额外配置代码页,只需要在BULK INSERT的参数块里加上
DATAFILETYPE = 'widechar',就能正常解析文件内容,完全不需要用到65001的代码页配置。 - 如果后续要导入无BOM的纯UTF-8文件,不要在2016环境硬套65001参数,可先把源文件转换为UCS-2 LE BOM格式配合上述
widechar参数导入,或改用SSIS数据流组件在读取阶段处理编码转换逻辑。
避坑提醒
- 不要把这个报错的排查方向往文件权限、路径合法性、源文件编码方向带,这个报错是纯语法参数的版本兼容问题,和文件链路没有任何关系。
- 不要为了绕过报错去修改服务器全局的区域代码页配置,这个操作既不会提升SQL Server本身的语法支持能力,还可能引发其他系统组件的区域兼容问题。
内容的提问来源于stack exchange,提问作者Kramerica
相关产品推荐
相关产品推荐

