ORA-01843 无效的月份的解决方法/NLS_DATE_FORMAT参数

一、什么是Oracle字符集

      Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。

 

影响Oracle数据库字符集最重要的参数是NLS_LANG参数。

它的格式如下: NLS_LANG = language_territory.charset

它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。

其中:

Language:指定服务器消息的语言,影响提示信息是中文还是英文

Territory:指定服务器的日期和数字格式,

Charset 指定字符集。

:AMERICAN _ AMERICA. ZHS16GBK

NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。

所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。

二.字符集的相关知识:

2.1字符集
   实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII
    Oracle的字符集命名遵循以下命名规则:
   <Language><bit size><encoding>

   : <语言><比特位数><编码>
   
比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集

NLS_DATE_FORMAT参数

 设置一下NLS_DATE_FORMAT参数来更改一下date参数的输出格式,但是遇到了问题:
SQL> select sysdate from dual;
SYSDATE
---------
07-NOV-08
在查阅文档后,发现这个参数确实不能通过ALTER SYSTEM命令来修改而是用ALTER SESSION:
SQL> alter session set nls_date_format='yyyy-mm-dd';
Session altered.
SQL> select sysdate from dual;
SYSDATE
----------
2008-11-07
虽然Oracle里的参数换了,但是查询后的显示结果任然是一样的:
SQL> select sysdate from dual;
SYSDATE
---------
07-NOV-08
WINDOWS系统,要修改注册表,server2003 64 oracle 11gr2 在注册表中的信息如下图:
ORA-01843 无效的月份的解决方法/NLS_DATE_FORMAT参数_第1张图片
里把nls_date_format的值改成yyyy-mm-dd,没有的话就新建一个字符串值(linux中,在.bash_profile中加入export NLS_DATE_FORMAT,Windows也可以设置环境变量),查询正常:
SQL> select sysdate from dual;
SYSDATE
----------
2008-11-07
看来NLS_DATE_FORMAT参数主要还是受到OS的影响,每次登录时会将OS的NLS_DATE_FORMAT参数加载进去。
    基本上除了修改环境变量就只能通过alter session来修改了,暂时还没有找到好一点的办法。
    要注意并不单是显示上的问题,而是在内部存储的值也会被覆盖:
SQL> select to_date(to_char(sysdate,'yyyy-mm-dd')) from dual;
select to_date(to_char(sysdate,'yyyy-mm-dd')) from dual
               *
ERROR at line 1:
ORA-01861: literal does not match format string
    在没有修改环境变量或session参数时,这个语句是无法执行的。修改后可以执行:
SQL> select to_date(to_char(sysdate,'yyyy-mm-dd')) from dual;
TO_DATE(TO
----------
2008-11-10
注:把参数NLS_DATE_FORMAT设置成yyyy-mm-dd,查询的过滤条件中date类型的字段就可以跟日期控件生成的时间字符串直接比较了,非常方便的,如果对查询速度要求高,可以给日期类型的字段创建一个基于函数的索引。

两种方式:设置环境变量;修改注册表。

看来NLS_DATE_FORMAT参数主要还是受到OS的影响,每次登录时会将OS的NLS_DATE_FORMAT参数加载进去。
    基本上除了修改环境变量就只能通过alter session来修改了,暂时还没有找到好一点的办法。
    要注意并不单是显示上的问题,而是在内部存储的值也会被覆盖:
看来NLS_DATE_FORMAT参数主要还是受到OS的影响,每次登录时会将OS的NLS_DATE_FORMAT参数加载进去。
    基本上除了修改环境变量就只能通过alter session来修改了,暂时还没有找到好一点的办法。
    要注意并不单是显示上的问题,而是在内部存储的值也会被覆盖:
看来NLS_DATE_FORMAT参数主要还是受到OS的影响,每次登录时会将OS的NLS_DATE_FORMAT参数加载进去。
    基本上除了修改环境变量就只能通过alter session来修改了,暂时还没有找到好一点的办法。
    要注意并不单是显示上的问题,而是在内部存储的值也会被覆盖:
 

你可能感兴趣的:(ORA-01843 无效的月份的解决方法/NLS_DATE_FORMAT参数)