生产上oracle数据库入库报错:
java.sql.SQLException:ORA-12899:value too large for column "xxx"(actual:34,maximum:30)
但是看日志,那个入库字段看着确实是一个17位长的数字。因为该业务已经稳定运行了一段时间,而34又是17的倍数,所以第一时间怀疑是因为入库字段本身的问题,可能是由于全半角导致。
因为在日志中看不出该字段的实际字节长度,所以在另一张表里查询该字段的字节长度。
SELECT LENGTHB(XXX) FROM XXXX WHERE XX = X;
结果确实是34,证实了猜想。
补充:
在使用oracle时,很多人不确定一个汉字(或者说一个全角字符)占多少个字节,是两个还是三个?
这个是根据oracle中的字符集编码决定的。
一般情况下,数据库的NLS_CHARACTERSET
为AL32UTF8或UTF8,即一个汉字占用三到四个字节。如果NLS_CHARACTERSET为ZHS16GBK,则一个字符占用两个字节。
SELECT * FROM v$nls_parameters WHERE PARAMETER='NLS_CHARACTERSET';
5: PARAMETER VALUE
6: ------------------------ ------------------------
7: NLS_CHARACTERSET ZHS16GBK
另外,LENGTH函数求得是占用字符数,LENGTHB或者VSIZE函数求得是占用字节数。
1: SQL> SELECT LENGTH('您好') FROM DUAL;
2:
3: LENGTH('您好')
4: --------------
5: 2
6:
7: SQL> SELECT LENGTHB('您好') FROM DUAL;
8:
9: LENGTHB('您好')
10: ---------------
11: 4
12: