oracle多语言环境下to_date时间转换问题
现象:在多语言环境下使用过oracle的同学想必都遇到过这样一个问题,
date_v date;
date_v := to_date('2010/11/16');--或'2010/11/16'
同一个服务器,不同oracle clinet 不一定都行得通。
原因: 不指定转换字符串的情况下,oracle使用既定的格式串进行日期转换操作,执行SELECT * FROM NLS_SESSION_PARAMETERS;察看NLS信息,其中NLS_DATE_FORMAT是当前的格式化日期的格式化字符串。我这里是"DD-MON-RR"(dd代表日rr代表年mon代表月),所以默认的转换变成to_date('2010/11/16','DD-MON-RR').MON在NLS_LANGUAGE为AMERICAN的情况下只识别Nov而不是别11,所以转换失败。
解决: 既然知道问题原因了,解决这个问题有三个方法。
1,更改NLS_LANGUAGE会使NLS_DATE_FORMAT同步为相应的格式。我们这里需要japanese格式。我通过增加环境变量(NLS_LANG=JAPANESE_JAPAN.JA16SJIS)实现。
NLS_DATE_FORMAT变成RR-MM-DD了,测试,select to_date('2010/11/15') from dual--ok。
2,增加环境变量NLS_DATE_FORMAT(RR-MM-DD或yy-mm-dd或yy/mm/dd任何你需要的格式)。
测试,select to_date('2010/11/15') from dual--ok。
这里要注意经过我测试,rr和yy是一个意思 ,连接符号-和/都可以使转换成功。
更改NLS_LANGUAGE或NLS_DATE_FORMAT的方法可以google以下.
到这里基本大功告成了,但是你也许会说我们不能随便修改oracle client的这些配置,因为其他实例也许需要它!下面是第三个方法
3,to_date有个重载方法,提供转换需要的format。
无论NLS_DATE_FORMAT是什么,select to_date('2010/11/15','yy/mm/dd') from dual--ok。
但是还是不要高兴过早了,select to_date('2010/nov/15','yy/mon/dd') from dual--不一定ok。
当NLS_LANGUAGE环境为AMERICAN时是OK的,为East Asia language时mon格式符真正识别的是11月(这里japan和china还是不一样的,看起来是一个字,但是从我机器输入select to_date('2010/11月/15','yy/mon/dd') from dual却出错。
具体细节可以参考文章http://www.eygle.com/special/NLS_CHARACTER_SET_05.htm
现在问题明白了,但解决方法这么多,难道转换一个字符串到日期真的这么周折?
我选择第三个方法,因为它是我能控制的。select to_date('2010/11/15','yy/mm/dd') from dual--ok,因为mm的转译永远是阿拉伯数字啊。
4, As a SQL function parameter. NLS parameters can be used explicitly to hardcode NLS behavior within a SQL function. Doing so will override the defaults set for the session in the initialization file, the client with environment variables, or set for the session by ALTER SESSION. For example:
TO_CHAR('Mar 24 2011','MM dd yyyy', 'nls_date_language = AMERICAN')
5,As initialization parameters on the server. You can include parameters in the initialization parameter file to specify a default session NLS environment. These settings have no effect on the client side; they control only the server's behavior. For example:
NLS_TERRITORY = "CZECH REPUBLIC"
6,As ALTER SESSION parameters. NLS parameters set in an ALTER SESSION statement can be used to override the defaults set for the session in the initialization file, or set by the client with environment variables.
SQL> ALTER SESSION SET NLS_SORT = FRENCH;
又增加了几个方法,最近在用sqlldr导从sybase出的一个csv时碰到问题,一列时间是 Mar 28 2011这样的,通过分析如果想导入到date列中只有在control文件的列配置中设置成这样 :
, record_date CHAR "to_date(:record_date,'MM dd yyyy','NLS_DATE_LANGUAGE=AMERICAN')"
。。。
最终导入成功,原理说白了就是“tell to SQLLOADER that I need to change his session”。
这个链接里有oracle关于nls方面的知识:http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a76966/ch2.htm#91066
这里有些关于sqlldr load文件的高级资料 :http://www.cnblogs.com/wzc998/archive/2011/03/24/1994137.html
案例:这样一个情景,现在有个存储要部署在未知地理未知服务器上,它需要一个date参数,plsql程序员想当然的吧它定义成了date,不巧,调用存储的另一个程序员是个想通过脚本来调用存储,并且通过windows计划任务触发脚本执行,这个脚本给了一个2010/11/15,看起来没任何问题,但是不巧这台应用服务器的oracle客户端的NLS_LANGUAGE=AMERICAN,真是无巧不成书啊,当oracle做这样一个调用前的参数转换工作的时候 date_v date; date_v := '2010/11/16'(这个转换是默认的不可控的);灾难来临了。
怎么避免这样的灾难呢?参数改成nvarchar吧,自己做参数转换,使用上面我们的第三个解决方法data_v:= to_date(data_vchar,'yy/mm/dd'),其实灾难可以避免。
有人会说,调用存储的人传了个2010¥/11……/16!怎么办,你的yyyy/mm/dd如何处理?当然没法处理,我的方法是给出一个准确的文档告诉对方参数应该是什么格式的,出错了也可以排除责任了。 另外我自己转换可以添加一些异常机制来提示问题,oracle自动转换出错了可是很霸道的。
NLS是什么,可以看这里http://www.cnblogs.com/wzc998/archive/2010/11/17/1879652.html
oracle多语言环境下to_date时间转换问题的更多相关文章
- Oracle 11g RAC环境下Private IP修改方法及异常处理
Oracle 11g RAC环境下Private IP修改方法及异常处理 Oracle 11g RAC环境下Private IP修改方法及异常处理 一. 修改方法 1. 确认所有节点CRS服务以启动 ...
- linux环境下deb格式 转换成rpm格式
linux环境下deb格式 转换成rpm格式 使用alien工具转换deb格式到rpm格式 alien_8.87.tar.gz 下载alien_8.87.tar.gz [root@mysqlnode2 ...
- Dynamics CRM2015 非基础语言环境下产品无法新建的问题
该现象出现在2015版本上,之前从没注意过这个问题不知道以前的版本是否存在. 我的安装包的基础语言是中文,第一张图有添加产品的按钮,切换到英文环境下后就没有了,一开始以为是系统做了隐藏处理,但用工具查 ...
- Oracle 修改语言环境
Oracle数据库还是用英文的比较好,毕竟是外国人开发的.而且许多提示都是模板化 的,所以不懂英文,也不要怕,多Google就会了. 唉,安装Oracle 数据库时,手贱语言选择了中文和英语.结果使用 ...
- Oracle在中文环境下出现乱码解决办法
zysong.ttf下载是一款oracle字体乱码解决工具,实质于缺乏中文字体包! 01情况的例子 02情况的例子 01.在开始安装的时候出现乱码 下载zysong.ttf,unzip 解压 一 ...
- Oracle在不同的语言环境结果to_date错误的问题
我写了一个存储过程,它使用了功能,有一些功能to_date(dateFrom, 'yyyy/mm/dd').执行发现数据插入错误后,数据插入"0001/9/14". 感觉莫名其妙, ...
- linux环境下的时间编程
Linux下提供了丰富的api以供开发者们处理和时间相关的问题.然而这些接口看似各自为政实则有有着千丝万缕的联系,在学习和时间中引发了各种各样的混乱.因此时间处理成为了许多Linux开发者的梦魇,遇到 ...
- 在C语言环境下使用google protobuf
本文写给经常使用C编程且不喜欢C++而又要经常使用google protobuf的人. 经常写通讯程序的人对数据进行序列化或者反序列化时,可能经常使用google的protobuf(PB ...
- springMVC-MyBatis-Mysql 环境下, 返回时间格式不是指定格式
在数据库中的时间是: 比如: 2018-04-06:12;23:34. 但是mybatis查询出来以后是下面的格式. {"updatedTime":{"date" ...
随机推荐
- Spring Cloud(5):Hystrix的使用
熔断:类似生活中的保险丝,电流过大就会熔断 降级:类似生活中的旅行,行李箱只有那么大,所以要抛弃一些非必需的物品 熔断降级应用: 某宝双十一商品下单,用户量巨大,于是考虑抛弃相关商品推荐等模块,确保该 ...
- java开发中涉及到的调优
JVM内存的调优 默认的Java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError. 1. Heap设定与垃圾回收Java Heap分为3个 ...
- easyui webuploader 文件上传演示
webuploader 上传首页 webuploader 上传前页面 webuploader 上传中页面 图就不上传了,状态会编程上传中 webuploader 已上传页面
- scp、paramiko、rsync复制文件的区别
1.paramiko只能复制文件,而不能复制目录,复制时,已经存在的会被覆盖;要想复制目录,只能把目录里的文件一个一个复制过去 2.scp可以复制文件.目录,复制时,已经存在的会被覆盖:可以模糊匹配: ...
- android_handler(二)
这篇记录 android 消息机制中.WorkThread 模拟向网络訪问数据,获得数据后,返回 message 发送给 MainThread ,并改动 TextView 的 text 的这种一个步骤 ...
- linux man 1,2,3 命令
原文: http://blog.sina.com.cn/s/blog_969c52730101c0p7.html ------------------------------------------- ...
- Lightoj 1027 - A Dangerous Maze 【期望】
1027 - A Dangerous Maze PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Y ...
- 安装eclipse中html/jsp/xml editor插件以及改动html页面的字体
近期在做android项目,用到了jquery mobile 框架以及phonegap,所以就会涉及一些html文件,可是html文件打开的方式是Text Editor ,而且打开之后一些html代码 ...
- docker (1) ---简介,使用
一.docker简介: 容器( container-based )虚拟化方案,充分利用了操作系统本身已有的机 制和特性,以实现轻量级的虚拟化(每个虚拟机安装的不是完整的虚拟机), 甚至有人把他称为新一 ...
- asp.net forms认证
工作中遇到的asp.net项目使用forms认证.以前虽然用过,但其原理并不了解,现在甚至对什么是form认证也完全不知道了.对一样东西如果不清楚其原理,不知其所以然,那么死记硬背是无济于事的. as ...