Sql server 使用BCP和UTF-16在Java中创建一个文件,以便加载到SQLServer2005中的nvarchar字段中

Sql server 使用BCP和UTF-16在Java中创建一个文件,以便加载到SQLServer2005中的nvarchar字段中,sql-server,bcp,utf-16,nvarchar,utf,Sql Server,Bcp,Utf 16,Nvarchar,Utf,我想使用BCP使用加载程序控制文件将nvarchar字段加载到SQLServer2005表中。据我所知,SQLServer2005只支持UTF-16,我相信它是UTF-16LE。该文件正在由Java程序输出。我目前的设置方式如下: final File f = new File("C:\\temp\\bcp_prob\\from_java-UTF-16.txt"); //LE with no BOM is important here: final String enco

我想使用BCP使用加载程序控制文件将nvarchar字段加载到SQLServer2005表中。据我所知,SQLServer2005只支持UTF-16,我相信它是UTF-16LE。该文件正在由Java程序输出。我目前的设置方式如下:

    final File f = new File("C:\\temp\\bcp_prob\\from_java-UTF-16.txt");
    //LE with no BOM is important here:
    final String encoding = "UTF-16LE";
    final OutputStream os = new FileOutputStream(f);
    final OutputStreamWriter outputStreamWriter = new OutputStreamWriter(os, encoding);
    final String theString = "UTF-16-LE, intermetálico básicos intermetálico película magnética dinámicos||another_col\r\n";        
    outputStreamWriter.append(theString);
    outputStreamWriter.flush();
    outputStreamWriter.close();
使用以下命令创建的XML格式BCP加载程序文件: bcp test_table格式nul-c-x-T-f test_table.xml-S服务器

使用以下代码编写输出的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在from_java.txt-T-f test_table.xml-S server-error.txt中

我在桌上看到的是“ÿþ”。而不是小恩迪安,BOM

我尝试了几种不同的参数变化排列:

改变了我生成加载程序控制文件的方式,对本机数据使用-n,而不是对字符数据使用-c……我认为这可能与此有关,但我没有看到插入的数据有任何改进 尝试了几种不同形式的UTF-16编码,包括并没有BOM的大端和小端,但都并没有成功 当我在某个地方读到Microsoft非常喜欢使用BOM信息时,尝试在文件中手动输出BOM 试图将文件输出为UCS-2而不是UTF-16,因为显然BCP实际上是将文件读取为 在bcp导入上尝试了-w,这确实有效,但不与加载程序格式文件结合。是否有方法将魔术告诉bcp的文件以UTF-16编码到格式文件中? 如果我在windows-1252中输出文件,并在加载文件时将该代码页指定为bcp的-c 1252选项,我可以让它工作,但我不想这样做,因为我将丢失信息,因为UTF-16是与1252相比可以表示的超集 是否有人设法使用UTF-16数据和加载器格式配置文件将bcp加载到nvarchar字段中

提前感谢,


-詹姆斯

我确实对这些回应感到不安,但我已经破解了它

加载程序文件需要使用-w标志生成,因此生成文件的命令为:

bcp格式nul-w-x T-f loader-control-w-format.xml-S-T||

这导致加载程序控制文件看起来有点不同,您会得到如下条目:

请注意,分隔符列为|\0 |\0,零对应于文件中的额外字节(UTF-16)或unicode(Microsoft错误地称之为双字节字符编码)

其他任何以这种方式处理BCP的人的理智注意事项:

当SQLServer谈到本机时,它们指的是本机字符,即重音字符 当SQLServer谈到Unicode时,他们实际上指的是Unicode字符集的UTF16小端编码方式。这就是-w所涉及的 当使用UTF-16写入要加载到BCP的文件时,该文件必须采用UTF-16 Little Endian格式,并且不能包含UTF BOM,因为BCP会将其解释为应加载的字节,并且您的第一条记录将包含BOM,呃! 用UTF-16编写文件的Java代码可以这样加载,如下所示:

    final File f = new File("C:\\temp\\bcp_prob\\from_java-UTF-16.txt");
    //LE with no BOM is important here:
    final String encoding = "UTF-16LE";
    final OutputStream os = new FileOutputStream(f);
    final OutputStreamWriter outputStreamWriter = new OutputStreamWriter(os, encoding);
    final String theString = "UTF-16-LE, intermetálico básicos intermetálico película magnética dinámicos||another_col\r\n";        
    outputStreamWriter.append(theString);
    outputStreamWriter.flush();
    outputStreamWriter.close();