我想使用 BCP 使用加载器控制文件加载到带有 nvarchar 字段的 SQL Server 2005 表中。据我了解,SQL Server 2005 仅支持 UTF-16(我相信它是 UTF-16 LE)。该文件正在由 Java 程序输出。我目前设置的方式如下:
XML 格式的 BCP 加载程序文件(使用以下命令创建
bcp test_table format nul -c -x -T -f test_table.xml -S server
:)使用以下代码编写输出的 Java 程序:
File f = new File("from_java.txt"); String encoding = "x-UTF-16LE-BOM"; OutputStream os = new FileOutputStream(f); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(os, encoding); String theString = "áááááLittle Endian, BOM\r\n"; outputStreamWriter.append(theString); outputStreamWriter.flush(); outputStreamWriter.close();
然后使用以下 bcp 命令:
bcp test_table in from_java.txt -T -f test_table.xml -S server -error error.txt
我在表中得到的是ÿþá
. 并不是áááááLittle Endian, BOM
我尝试了几种改变参数的不同排列:
- 更改生成加载程序控制文件的方式(使用 -n 表示本机数据而不是 -c 表示字符数据...我认为这可能与它有关,但我没有看到插入的数据有任何改进)
- 尝试了几种不同形式的 UTF-16 编码,包括没有 BOM 的大端和小端,但无济于事
- 尝试在文件中手动输出 BOM,因为我在某处读到 Microsoft 真正喜欢使用 BOM 信息的地方
- 考虑尝试将文件输出为 UCS-2(而不是 UTF-16),因为那是(显然)BCP 实际读取文件的内容
- 在 bcp 导入上尝试了 -w ,这确实有效,但不能与加载器格式文件结合使用(有没有办法将任何魔法告诉 BCP 文件以 UTF-16 编码到格式文件中?)
- 如果我在 windows-1252 中输出文件并在加载文件时将该代码页指定为 bcp 的选项,我可以让它工作
-c 1252
(但我不想这样做,因为我会丢失信息,因为 UTF-16 是与 1252 相比可以表示的超集)
有没有人设法让 bcp 使用 UTF-16 数据和加载器格式配置文件加载到 nvarchar 字段中?
提前致谢,
-詹姆士