mysql导数到oracle(表结构字段长度相同,ORA-12899: value too large for column (actual: 27, maximum: 20))

mysql导数到oracle(表结构字段长度相同,ORA-12899: value too large for column (actual: 27, maximum: 20)

  • 分析步骤
  • ORA-12162: TNS:net service name is incorrectly specified
  • ORA-12547: TNS:lost contact错误解决方法
  • ORA-12899: value too large for column (actual: 27, maximum: 20)错误解决

分析步骤

mysql库与oracle库表结构字段长度等都一致,在两个库互相导数的过程中出现ORA-12899: value too large for column (actual: 27, maximum: 20),刚开始认为是oracle中UTF,一个中文字占三个字节,而GBK,一个中文字占两个字节,故尝试将oracle字符集改为GBK,而后发现依旧是这个问题,经过思考,mysqlvarchar类型一个中文字占1字节,oracle nvarchar2一个中文字也占一个字节,故最终将oracle中varchar2类型改为nvarchar2类型,问题解决

ORA-12162: TNS:net service name is incorrectly specified

[oracle@ ~]$ vi ~/.bash_profile
ORACLE_BASE=/data/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
ORACLE_SID=orcl
export ORACLE_SID ORACLE_BASE ORACLE_HOME

ORA-12547: TNS:lost contact错误解决方法

检查是否权限问题
$ cd $ORACLE_HOME/bin
$ ls -l oracle
输出的正确权限应该如下:
-rwsr-s--x 1 oracle dba
如果不是请按如下修改:
$ chmod 6751 oracle

ORA-12899: value too large for column (actual: 27, maximum: 20)错误解决

  1. 尝试解决方式(A)(无效)
oracle11g导入数据时报以下错误,这是因为原来数据库的编码是GBK的,每个汉字两个字节,但新数据库是UTF-8的,每个汉字是三个字节的,导致超过长度了。

解决方法:

打开cmd命令窗口,输入“sqlplus /nolog”,进入“SQL>”的输入符下,按照下面给出的命令一次执行就可以了。

SQL>connect username/password as SYSDBA;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK ;
ALTER DATABASE CHARACTER SET ZHS16GBK;
*ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
此时报错,不必慌张。提示新字符集必须是超集,此时INTRENAL_USE指令不对字符集超集进行检查。输入以下命令即可:

SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP;
此时完成字符集转换。


问题起始:同样的文件导另一库报错
问题根源:数据库服务端字符集问题
问题解决:AL32UTF8转换为ZHX16GBK即可
转换参考链接:https://blog.csdn.net/iamlaosong/article/details/52316844

数据导入时报ORA-12899错误,即插入的数据长度超出字段的设置长度,实际长度并不长,这是由于Oracle字符集不同,汉字占的长度不同造成的。中文在ZHS16GBK中占2个字节,在UTF-8中却占3个字节,所以汉字导入UTF-8字符集的数据库就很容易出现字段长度不够,解决办法,一个是增加字段长度,还有就是修改字符集。如果系统中已经存在很多数据,建议修改字段长度,因为修改字符集后原来数据库表中的汉字全部变成乱码。如果一定要修改字符集,必须先导出数据,待到字符集修改后再重新导入这些数据。
如上图所示,字符集是UTF-8,修改字符集的方法如下:
修改数据库字符集为:ZHS16GBK
查看服务器端字符集SQL > select * from VNLSPARAMETERSTelnet到服务器,执行:NLS
P
    
ARAMETERSTelnet到服务器,执行:sqlplus /nolog
SQL>conn / as sysdba
若此时数据库服务器已启动,则先执行 SHUTDOWN IMMEDIATE 命令关闭数据库服务器,
然后执行以下命令:
SQL>shutdown immediate
SQL>STARTUP MOUNT
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
ERROR at line 1:ORA-12721: operation cannot execute when other sessions are active
若出现上面的错误,使用下面的办法进行修改,使用INTERNAL_USE可以跳过超集的检查:
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
SQL>SHUTDOWN IMMEDIATE
SQL>STARTUP
  1. 尝试解决方式(B)(成功)

mysql的varchar长度表示字符长度,一个汉字和一个英文字母的长度都是1
oracle的varchar2长度表示的是字节长度,在utf-8的编码模式下,一个汉字为3个字节,1个字母或数字为1个字节,nvarchar2长度表示字符长度,汉字和字母长度都是1

将oracle字段类型改为nvarchar2

你可能感兴趣的:(java,mysql,oracle,导数)