使用BCP导出SQL Server数据至Snowflake时的UTF-8编码错误求助
解决BCP导出UTF8文件到Snowflake的编码问题
首先咱们定位问题根源:你在BCP命令里同时用了-w参数和-C 65001,这俩参数是冲突的!
-w参数会强制BCP导出**UTF-16LE(带BOM)**格式的文件,这个参数会直接忽略你指定的-C 65001(UTF8)代码页设置。所以你实际导出的根本不是UTF8文件,而是UTF16编码的文件——Snowflake按UTF8解析时自然会出现无效字节错误,启用IGNORE_UTF8_ERRORS后出现乱码也就在所难免了。
下面给你两种可行的解决方向:
方向一:修改BCP命令导出标准UTF8文件(推荐)
去掉-w参数,改用-c(字符模式)配合-C 65001,这样能生成真正的UTF8编码文件(无BOM),完美匹配Snowflake的UTF8解析逻辑:
BCP "SELECT Id, Name FROM database_name.owner_name.table_name WHERE Id = '0011602001r4ddgAZA'" queryout C:\temp\test.csv -t"|" -c -T -S. -C 65001
如果你的Snowflake COPY命令需要匹配.csv.gz格式,导出后可以用gzip工具压缩文件,再上传到阶段。
方向二:调整Snowflake文件格式适配UTF16文件
如果因为业务限制必须保留BCP的-w参数,那需要把Snowflake的文件格式改成UTF16编码,并处理文件BOM:
-- 创建适配UTF16的文件格式 create or replace file format SFCI_Account type = 'CSV' field_delimiter = '|' validate_utf8 = True encoding = 'UTF16' skip_header = 0; -- 若导出文件包含表头,需调整对应数值 -- 重新关联阶段与新格式(或直接在COPY命令中指定) create or replace stage SFCI_Account_stage file_format = SFCI_Account; -- 执行导入命令 copy into Test from @SFCI_Account_stage file_format = (format_name = SFCI_Account) pattern='.*.csv.gz' on_error = 'skip_file';
额外验证小技巧
你可以用Notepad++打开导出的test.csv,查看它的实际编码:
- 用方向一的命令导出,编码会显示为「UTF-8」
- 用原命令导出,编码会显示为「UTF-16 LE」
这样就能快速确认导出文件的编码和Snowflake的文件格式是否匹配啦。
内容的提问来源于stack exchange,提问作者ASturt




