得一团乱麻了,Oracle SQL Developer完全忽略客户端NLS_LANG设置倒是让事情变得简单,不过PL/SQL Developer则是另一回事,我花了4天时间企图搞明白其中的编码转换过程,最终只证明它就是个不可理喻的玩意儿,唯一目前看起来还正确的结论是:如果要用PL/SQL Developer,只好还是把NLS_LANG设置得跟数据库字符集一致。其它就只能自求多福了。
5.NLS_LANG对ODP.NET的影响
View Code
唯一受客户端NLS_LANG影响的是OracleString的GetNonUnicodeBytes()方法,此方法依赖于客户端本地设置的字符集,例如我们把NLS_LANG从AMERICAN_AMERICA.WE8MSWIN1252改成AMERICAN_AMERICA.US7ASCII
其中230(即HexE6)正是字符‘?’的编码,而63(即Hex3F)是ASCII中的问号(由于ASCII字符集中没有‘?’,故用问号代替)。
6.关于VARCHAR2, NVARCHAR2的其它问题
NVARCHAR2(N),其中的N是指字符数,不是字节数。不过其最大长度是以字节为单位,即4000字节。
VARCHAR2(N),其中的N可能是指字符数,也可能是指字节数。你可以显式地在声明的时候指定,比如VARCHAR2(10 BYTE)或者VARCHAR2(10 CHAR),未显式指明时,则由参数NLS_LENGTH_SEMANTICS决定。需要注意的是你能成功声明VARCHAR2(4000 CHAR)并不能保证你能真的存储4000个字符,如果超过4000字节,该报错Oracle还是会报错。