我以Feed的形式从erp系统获取数据,特别是Feed中的一列长度仅为15。
在目标表中也对应列也长度为varchar2(15)
但是当我尝试将其加载到db时它显示错误如:
ORA-12899:列emp_name的值太大(实际值:16,最大值: 15)
我无法增加列长度,因为它是生产中的基表。
答案 0 :(得分:8)
这类问题的常见原因是非ASCII字符,可以在原始数据库中用一个字节表示,但在目标数据库中需要两个(或更多)字节(由于不同的NLS设置)。
要确保目标列足够容纳15个字符,您可以对其进行修改:
ALTER table_name MODIFY column_name VARCHAR2(15 CHAR)
(注意15 CHAR
- 您也可以使用BYTE
;如果两者都不存在,则数据库使用NLS_LENGTH_SEMANTICS设置作为默认设置。
要检查哪些值大于15个字节,您可以
15 CHAR
使用
查找有问题的行SELECT * FROM staging WHERE lengthb(mycol)> 15
(注意使用LENGTHB
作为LENGTH
- 前者返回长度(以字节为单位),后者以字符形式返回长度)
答案 1 :(得分:5)
看看这个博客,通过将列数据类型从varchar(100)更改为varchar(100 char)来解决问题。在我的情况下,数据包含一些变音字符。
http://gerardnico.com/wiki/database/oracle/byte_or_character
答案 2 :(得分:0)
我发现AL32UTF8是唯一有效的设置。这与标准UTF8不同,少数字符具有补充字节,即字符大约99%相同。我猜你正在进行角色转换问题。换句话说,table1中的数据是使用一个字符集编写的,而新表的字符集略有不同。
如果这是真的,你必须找到oddball charset的来源。因为这将继续发生。
答案 3 :(得分:0)
解决方案:
ORA-12899:栏目价值过高(实际,最大)
如果您在更新已经拥有超过下面新长度的数据的表的列大小时遇到问题,那么这个简单的脚本肯定会有效。
ALTER TABLE TABLE_NAME ADD (NEW_COLUMN_NAME DATATYPE(DATASIZE));
UPDATE TABLE_NAME SET NEW_COLUMN_NAME = SUBSTR(OLD_COLUMN_NAME , 1, NEW_LENGTH);
ALTER TABLE TABLE_NAME DROP COLUMN OLD_COLUMN_NAME ;
ALTER TABLE TABLE_NAME RENAME COLUMN NEW_COLUMN_NAME TO OLD_COLUMN_NAME;
查询的含义:
ALTER TABLE TABLE_NAME ADD (NEW_COLUMN_NAME DATATYPE(DATASIZE));
它只会在现有表格中创建所需新长度的新列。
UPDATE TABLE_NAME SET NEW_COLUMN_NAME = SUBSTR(OLD_COLUMN_NAME , 1, NEW_LENGTH);
它将从旧列值中丢弃新长度值之后的所有值,并将修剪后的值设置为新列名。
ALTER TABLE TABLE_NAME DROP COLUMN OLD_COLUMN_NAME ;
现在将删除旧列名称为荒谬,我们已将所有信息复制到新列中。
ALTER TABLE TABLE_NAME RENAME COLUMN NEW_COLUMN_NAME TO OLD_COLUMN_NAME;
将新列名重命名为旧列名将帮助您重新获得原始表结构,但新列的大小除外。