ORACLE之NLS的那些事

        在编程领域中,由多个英文单词简写组成的专业术语有时让人难以理解,但一旦清晰知道是由哪些个单词组成后便容易理解很多,NLS也在此范围内;

        NLS全称是National Language Support,翻译过来就是国家或民族语言支持。要彻底理解这个概念首先要明白什么是民族语言支持,那么先来两个例子加深理解:

1、日期:拿2022年6月22日为例,在ORACLE默认的日期格式DD-MON-RR时,中文语言环境将会表达为22-6月 -22,英语环境则为22-JUN -22,然而又在标准日期格式yyyy-MM-dd后变为2022-06-22。通过这个例子可以看出同一日期在不同日期格式不同语言环境下会以不同的方式表现出来;

2、货币:货币差异如图所示

ORACLE之NLS的那些事_第1张图片

综上,可以得出结论:同一事物在不同语言环境下会表现不同;

对此,ORACLE针对数据库存放数据所处的语言环境做了支持,这个支持就是NLS;我们可以通过以下SQL来查询NLS机制提供了哪些特殊配置:

select * from V$NLS_PARAMETERS;

 结果如下:

ORACLE之NLS的那些事_第2张图片

如果以上内容大部分看不懂的话,咱们可以借助SQL Developer的帮助看一下,操作顺序如下:

ORACLE之NLS的那些事_第3张图片

ORACLE之NLS的那些事_第4张图片

 通过上述可以看到,我们默认的日期格式为DD-MON-RR,日期语言环境为简体中文,这是数据库中日期格式的数据在NLS下显示如下图所示,跟预想一致: 

ORACLE之NLS的那些事_第5张图片

那么我们试着将日期格式改为YYYY-MM-DD HH24:MI:SS,可以发现日期格式(DATE类型)也发生了变化

ORACLE之NLS的那些事_第6张图片

ORACLE之NLS的那些事_第7张图片

至此,我们可以得出两个结论:

  1. 我们可以通过直接使用SQL或者SQL Developer来查看或者设置ORACLEde NLS;
  2. 当我们修改NLS对应参数时,数据库各表中不同数据类型字段表现会发生变化;

 再来说一下开发中常见的NLS问题,无效的月份问题,如下:

ORA-01843: 无效的月份
01843. 00000 -  "not a valid month"

        这个问题常见于手动备份导入数据SQL时,比如从数据库A导出一个SQL,然后倒入到数据库B中,如果出现这个问题就需要确认下数据导出方和导出方的日期语言和日期格式,两者缺一不可;之前常遇到的问题就是数据导入和导出方日期格式均默认为DD-MON-RR,但由于日期语言一个是SIMPLIFIED CHINESE,一个是AMERICAN。即由于日期语言不一致,导致产生无效月份问题,知道原因后,那么就好处理了,即把日期格式统一为YYYY-MM-DD HH24:MI:SS,然后重新导出导入即可;

        数据导入导出时有必要确定双方的NLS是否一致!

        以上,完了!

你可能感兴趣的:(Oracle,oracle,数据库,java)