博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Oracle问题笔记

Posted on 2023-01-06 11:32  Sxcan  阅读(663)  评论(0编辑  收藏  举报
1.ORA-01841: (完整) 年份值必须介于 -4713 和 +9999 之间, 且不为 0
--转换为字符可查出哪笔记录的日期存在问题
select distinct to_char(date_col, 'yyyy') from table_name
2.ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小

开发找来反馈说插入日文时提示此报错,但字段的长度看起来是够的,于是研究了下字段的问题。

原因:

在10g及后续版本中,oracle字符字段的宽度是有两个单位:字符(char)和字节(bytes),创建表时如果不指定单位,会默认时字节。而日文在字符集AL32UTF8和UTF8中,一个字符占用3个字节。

测试:
--字段长度单位为字节
create table test (name varchar2(5));
--插入报错,报错:ORA-12899: value too large for column "TEST"."NAME" (actual: 15, maximum: 5)
insert into test values('こんにちは');
--修改栏位长度为15字节,插入成功
alter table test modify name varchar2(15);
--查看栏位值的长度
select name,length(name) char_len ,lengthb(name) byte_len from test;
こんにちは	5	15
--查看数据库的字符集
select value from NLS_DATABASE_PARAMETERS where parameter='NLS_CHARACTERSET';
AL32UTF8
--修改字段的长度单位,再次插入即可成功
alter table test modify name varchar2(5 char);
拓展

dump函数使用,格式:DUMP(expr[,return_fmt[,start_position][,length]])

expr:这个参数是要进行分析的表达式(数字或字符串等,可以是各个类型的值)
return_fmt:指返回参数的格式,有5种用法:
          1)8:以8进制返回结果的值
          2)10:以10进制返回结果的值(默认)
          3)16:以16进制返回结果的值
          4)17:以单字符的形式返回结果的值
          5)1000:以上4种加上1000,表示在返回值中加上当前字符集
start_position:开始进行返回的字符位置
length:需要返回的字符长度
select name,DUMP(NAME,10) from test;
こんにちは	Typ=1 Len=15: 227,129,147,227,130,147,227,129,171,227,129,161,227,129,175
select name,DUMP(NAME,10) from test;
こんにちは	Typ=1 Len=15 CharacterSet=AL32UTF8: 227,129,147,227,130,147,227,129,171,227,129,161,227,129,175