Sql server 使用BCP和UTF-16在Java中创建一个文件,以便加载到SQLServer2005中的nvarchar字段中
我想使用BCP使用加载程序控制文件将nvarchar字段加载到SQLServer2005表中。据我所知,SQLServer2005只支持UTF-16,我相信它是UTF-16LE。该文件正在由Java程序输出。我目前的设置方式如下: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
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();