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

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)错误解决

尝试解决方式(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

尝试解决方式(B)(成功)

mysql的varchar长度表示字符长度,一个汉字和一个英文字母的长度都是1

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

将oracle字段类型改为nvarchar2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值