作者iFEELing (ing)
看板Database
标题Re: [系统] ORACLE NLS_LANG 设定问题
时间Fri Apr 4 21:32:39 2008
※ 引述《alexcwtzeng ()》之铭言:
: ※ 引述《iFEELing (ing)》之铭言:
: : 有一台pc 里面有装 ORACLE XE Server , ORACLE XE Client, ORACLE 9i Client
: : ORACLE XE Server 里面table装的是 UTF8 的资料 , 9i client 是接去
: : 另一台 ORACLE Enterprise , 里面装的是 ZHT16Big5 的资料
: : 在这台PC里面使用 PERL 的 DBI DBD::ODBC 接 ORACLE XE 的ODBC Driver
: : 可是无论是在系统变数里面设 NSL_LANG=.ZHT16BIG5
: : 或是在 command lind shell 里面用 set 设定
: : 或是在 perl 里面用 ENV 设定,
: : 从 XE 吐回来的资料好像都是 UTF8 ...
: : 想请教一下还有什麽地方可以调整的呢? 感谢...
: 看来好像有两台 DB?? XE Server 跟 Enterprise 这一台的关系是?
: 你的说明有点让人不清楚。
呃 实际上应该是这样
在一台PC上有装 XEServer,XEClient,9iClient (电脑A)
另外有一台 ORACLE 9 Server (电脑B)
XE里的资料是 UTF8 (NVARCHAR2),T_C,AL32UTF8
ORACLE9 Server 里的资料是 Big5(VARCHAR2),AMERICAN,ZHT16BIG5
电脑A上的程式需要同时读取 XE (@电脑A)跟 Enterprise(@电脑B) 这两个 DB 的资料
原本的存取方式是 JSP/Perl <---> ODBC <---> 9iClient ODBC <---> 9iServer
<---> XEClient ODBC <---> XE Server
: 就字面来说:
: Create Database 时用的 Character 是什麽,Database 就是「吐」什麽回来。
: 在 Client 设定 NLS_LANG 粗略的说法是 Display 用的。从 Database 接过来 Decode後
: ,然後显示在 SQL*Plus 或其他程式中。
: 再来,你说 XE 吐回来的资料「好像」都是 UTF8? 请问你的查法是? 我真的很想知道。
呃 我不是很确定这样的查法对不对
我是用 perl 的 ODBC Module 去 Connect DB , 把资料用 binary mode dump 到档案
再用 PsPad 的 HEX 模式去比对字码。 XE Server 上的资料是经过 XE的 WEB 界面
输入的。我把该栏位的中文字,在全字库里查它的Big5及Unicode编码 再对照
dump的结果 看起来档案的内容比较像是 unicode , 但不完全相同
btw,google了接近两周,我查到一些似乎合理的说法
"由於 ORACLE 是用java程序驱动,NLS_LANG设定仅对非JAVA驱动的程式有作用"
於是我改用 ORACLE 的 JDBC 搭配 JSP 试着存取资料库 果然可以正确的存取
然後
"NLS_LANG的设定方式可以透过在注册表中写,在环境变数中设定,
在cmd shell中使用set命令设定 及在连线中透过 ALTER SESSION 的方式设定"
於是我开始一个一个设 但,在登录表中,有三个ORACLE , 分别是 ORACLE XE,
ORACLE XE Client 及 ORACLE 9i Client, 登录表中的ORACLE/home 也有三个,
分别是home0 , home1, home2 根据里面记的资料(好像是path还是什麽吧)
我觉得 home0 应该是 9i client , 於是我更动了 home1,home2 的 NLS_LANG
然後就是一大堆home0 home1 home2 的比对交叉测试 花了我快两周 我老板的
脸色也越来越糟 XD
最後我解决的方式是 JSP <--> ORACLE JDBC <--> XE & Enterprise ,
JSP的encoding编码设成UTF8 , XE/Enterprise 吐回来的资料也是 UTF8
Perl <--> Microsoft Oracle Client Driver <--> XE & Enterprise
NLS_LANG 则是不管在 登录表(XE,XEclient,Oracle/Home0,1,2),环境变数,
以及 Perl 中透过 ENV{} 的方式 通通设成 Big5 , 吐回来的也是 BIG5
然後,再透过Perl的Encode Module 转成UTF8.
目前是大至上看起来正常啦...下周开始给客户试用就晓得会不会包了 XD
----
所以最後的结论就是, 用ODBC时 NLS_LANG设好 给 ORACLE Client自己转,
这样反而会得到正确的Big5 , 至於用 UTF8 透过JSP / JAVA 去连
ODBC的UTF8目前还不晓得该怎麽办
这是我第一次碰ORACLE , 之前都在用 MySQL ...不是很了解这个大怪兽的逻辑:P
感谢您的回应~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.134.36.154