Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问使用MS Access创建的Oracle10g数据库中的Blob_Java_Oracle_Ms Access_Character Encoding_Blob - Fatal编程技术网

Java 访问使用MS Access创建的Oracle10g数据库中的Blob

Java 访问使用MS Access创建的Oracle10g数据库中的Blob,java,oracle,ms-access,character-encoding,blob,Java,Oracle,Ms Access,Character Encoding,Blob,我正在编写一个Java(好的,Groovy,但这在这里并不重要)迁移脚本,将BLOB字段从Oracle10g数据库复制到另一个数据库。数据是由MS Access应用程序创建的。这些文件似乎编码不正确,我猜MS Access或ODBC驱动程序以某种方式操纵了该文件 使用查询SELECT*FROM NLS_DATABASE_PARAMETERS,其中PARAMETER='NLS_CHARACTERSET'我发现源数据库具有charactersetWE8MSWIN1252 源表定义为: CREATE

我正在编写一个Java(好的,Groovy,但这在这里并不重要)迁移脚本,将BLOB字段从Oracle10g数据库复制到另一个数据库。数据是由MS Access应用程序创建的。这些文件似乎编码不正确,我猜MS Access或ODBC驱动程序以某种方式操纵了该文件

使用查询
SELECT*FROM NLS_DATABASE_PARAMETERS,其中PARAMETER='NLS_CHARACTERSET'
我发现源数据库具有characterset
WE8MSWIN1252

源表定义为:

CREATE TABLE CTR_DOCUMENTS (
  CTR_ID        NUMBER(11)           NOT NULL,
  CTR_A_ID      NUMBER(11),
  CTR_FILENAME  VARCHAR2(260 Char)   NOT NULL,
  CTR_COMMENT   VARCHAR2(255 Char),
  CTR_DATE      DATE,
  CTR_DATA      BLOB
)
我访问blob的方式如下:

def blob = sourceDB.firstRow("SELECT CTR_DATA FROM CTR_DOCUMENTS WHERE CTR_ID = ?",
  [id]).CTR_DATA
def blobSize = blob.length()
def blobStream = blob.getBinaryStream()
byte[] byteArray = new byte[blobSize]
blobStream.read(byteArray)
我将一些blob保存为文件,编码看起来很复杂,文件无法被程序打开。第二个字节始终为00:

0000000: 2500 5000 4400 4600 2d00 3100 2e00 3500  %.P.D.F.-.1...5.

我还观察到使用SQL客户机(SQL Workbench/J、SQLDeveloper、TOAD)访问BLOB的相同行为

对我来说,似乎我必须将文件从Windows-1252转换为UTF8,但这不起作用。
我在这里遗漏了什么吗?

出于诊断目的,如果没有其他内容,我将从扫描输入点样本中的字节数组开始,以查看是否每秒钟的字节实际上都是
0x00
,并将每隔一个(非零)字节写入
字节数组。如果成功,我会将
bytesOut
数组写入文件,看看它们现在是否是有效的PDF文档。例如:

publicstaticvoidmain(字符串[]args){
试一试{
字符串connectionUrl=“”;
connectionUrl=
“jdbc:sqlserver://localhost;" +
“instanceName=SQLEXPRESS;”+
“databaseName=myDb;”+
“integratedSecurity=true”;
Connection con=DriverManager.getConnection(connectionUrl);
字符串SQL=
选择CTR_ID、CTR_文件名、CTR_数据+
“来自CTR_文档”+
“其中CTR_ID介于1和5之间”;
语句stmt=con.createStatement();
结果集rs=stmt.executeQuery(SQL);
while(rs.next()){
布尔writeFile=true;
byte[]bytesIn=rs.getBytes(“CTR_数据”);
//扫描输入字节数组,并将每秒钟一个字节复制到输出字节数组
byte[]bytesOut=新字节[bytesIn.length/2];
for(int i=0;i

其原因是,如果某个过程在某个地方采用了它认为是单字节字符的“字符串”(例如,Windows-1252)并通过在每个字符后插入
0x00
转换为Unicode(例如,UCS-2LE)(而不损坏实际数据字节),那么最简单的解决方案就是再次取出那些
0x00
字节。

blob是二进制文件,不应该使用字符编码。表示文本的CLOB可以有一个编码。是否可以在问题中添加Oracle表定义?是否正在将文件复制到另一个Oracle数据库?如果是,为什么不使用数据库链接?请参阅:“我还观察到使用SQL客户机(SQL Workbench/J、SQLDeveloper、TOAD)访问Blob的相同行为。”您是说源数据库中的Blob不能使用SQL Developer正确打开吗(双击结果中的BLOB单元格时使用View Value?如果为真,则表示您的BLOB没有正确存储。是的,RMAN,这是正确的。我的问题是MS Access应用程序或ODBC驱动程序以某种方式对文件进行了编码。