繁体   English   中英

由于字符集不同,无法通过Java将数据从DB2复制到Oracle

[英]Unable to copy data from DB2 to Oracle via Java because of different charsets

我正在通过resulSet从DB2表读取列字段(char(255)):

String tmp = rs.getString(i);

该字符串在表中的长度为255个字符,但是当我尝试通过插入语句将此值放在Oracle列(char(255))中时

insertStmt.setString(j,tmp);

我得到一个SQL异常:

ORA-12899: value too large for column "[schema_name]"."[table_name]"."[column_name]" (current: 258, max: 255)

我知道

tmp.getBytes("UTF-8").length

是258,因为三个“è”字符使用两个字节而不是一个字节。

如何将这个字符串成功转换/插入到Oracle表中? 我可以从Oracle数据库中读取

NLS_CHARACTERSET    AL32UTF8

但我无法在Java方面处理它。

您是否可以更改NLS_LENGTH_SEMANTICS或扩展目标字段?

NLS_LENGTH_SEMANTICS允许您根据字符而不是字节来指定列数据类型的长度。 通常,这是在使用AL32UTF8或UTF8或其他宽度可变的NLS_CHARACTERSET数据库时,其中一个字符并不总是一个字节。

如果未在数据库级别定义,则可以在会话级别设置。

ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE

Oracle建议在创建表时显式使用CHAR。

Create table scott.test (Col1 CHAR(20 CHAR),Col2 VARCHAR2(100 CHAR));

在导入或使用“ alter table Modify”时也将起作用。

在PL / SQL中访问列时,请显式定义变量,例如

Col2 VARCHAR2 (10 CHAR);

限制:实例或会话值仅在创建NEW列时使用。 最好避免在同一张表中混合使用BYTE和CHAR语义列。

至于最大宽度,请看一个典型的3字节UTF8字符:如果将一列定义为varchar2(1333)CHAR,并且插入了超过1333个字符,您仍然会收到“ ORA-12899:该列的值太大”。 在这些情况下,oracle建议将varchar2转换为CLOB。

您的列是使用BYTE语义定义的,您必须使用DDL切换到CHAR语义,例如:

alter table tst modify (txt varchar2(5 CHAR));

小例子:

create table tst
(txt varchar2(5));

insert into tst (txt) values('ééééé');
-- SQL-Fehler: ORA-12899: value too large for column "REPORTER"."TST"."TXT" (actual: 10, maximum: 5)

请注意,BYTE语义仅允许存储5个字节,并且插入失败。

alter table tst modify (txt varchar2(5 CHAR));

insert into tst (txt) values('ééééé');

1 row inserted

CHAR语义允许存储5个字符,即使它们占用的字节数超过5个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM