天天看点

nvarchar2导致ora-00600 kpp_concatq 问题

一、问题描述

有一条SQL语句忽然在plsql里运行失败,提示ora-00600错误

nvarchar2导致ora-00600 kpp_concatq 问题

很奇怪,这条语句在昨天并没有啥问题,今天忽然就报错了。语句没改,数据也没动。

SQL语句如下:

select round(avg(albinism),2) count,stationcode,x,y 
from (select s.stationcode,s.albinism,t.x,t.y 
   from  SDE.SURVEY_CR_IMAGE s
   inner join  SDE.SURVEY_PUBLIC p on s.publicid=p.id
   inner join  SDE.SURVEY_STATION t on s.stationcode=t.code
   where p.region ='花果山周边海域'
   )
group by stationcode,x,y      

我左看右看,没发现有什么语法问题。将中间临时结果插入一个临时表,结果就OK

create table tmp_t1 as select s.stationcode,s.albinism,t.x,t.y 
 from  SDE.SURVEY_CR_IMAGE s
      inner join  SDE.SURVEY_PUBLIC p on s.publicid=p.id
      inner join  SDE.SURVEY_STATION t on s.stationcode=t.code
      where p.region ='花果山周边海域'   
            
select round(avg(albinism),2) count,stationcode,x,y from tmp_t1 group by stationcode,x,y;      

实在不知道是什么原因。

求助万能的互联网,说是nvarchar2问题

​ora-00600 kpp_concatq:2错误解决方法

如果把过滤条件(p.region =‘花果山周边海域’)由汉字改为英文或数字,错误消失,估计就是字符编码问题了。将表字段类型由 nvarchar2 改为 varchar2,问题果然解决。

二、NVarchar2、Varchar2、Varchar的区别

varchar是sql标准类型,而varchar2,从名字看,顾名思义,是varchar2的升级版,是oracle独有的。nvarchar2就是针对非英文的varchar2了。

1、Varchar VS Varchar2

varchar对于汉字占两个字节,对于数字,英文字符是一个字节,占的内存小;

varchar2一般情况下把所有字符都占两字节处理,但具体要看字符集。如GBK,每个汉字2字节,英文一个字节;UTF-8,每个汉字3字节,英文仍为1个字节。

varchar对空串不处理,varchar2将空串当做null来处理。

如果是要更换不同的数据库,例如mysql,那么就用varchar,如果就用oracle,那么用varchar2比较好一点。

varchar和varchar2的区别

2、NVarchar2 VS Varchar2

从使用角度来看区别在于:NVARCHAR2在计算长度时和字符集相关的,例如数据库是中文字符集时以长度10为例,则

1)NVARCHAR2(10)是可以存进去10个汉字的,如果用来存英文也只能存10个字符。

继续阅读