暂无图片
如果Oracle没有设置客户端字符集变量NLS_LANG,那么客户端默认会用什么字符集?
我来答
分享
暂无图片 匿名用户
如果Oracle没有设置客户端字符集变量NLS_LANG,那么客户端默认会用什么字符集?

如果Oracle没有设置客户端字符集变量NLS_LANG,那么客户端默认会用什么字符集?

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
三笠丶
暂无图片

如果不设置 NLS_LANG,NLS_LANG 值默认为空,数据库查询出来的客户端字符集为对应数据库字符集,并不影响使用,我还原了一下:

image.png

关于客户端字符集和数据库字符集可以参考:《Oracle 查看数据库字符集和客户端字符集 SQL 语句》

暂无图片 评论
暂无图片 有用 0
暂无图片
Thomas

我感觉应该不行。在客户端登录时,会提示:

ERROR:
ORA-12705: Cannot access NLS data files or invalid environment specified

暂无图片 评论
暂无图片 有用 0
DarkAthena

我数据库字符集是AMERICAN_AMERICA.AL32UTF8
image.png
然后把操作系统里的环境变量、注册表里的字符集都删了,登录plsqldeveloper,提示
image.png
点确定进去
image.png

再看看sqlplus
image.png

然后把环境变量配置上去看看,
image.png
会弹出字符集不匹配的信息,点确定进去
image.png
image.png

最后看下官方的解释
image.png
如果没有设置字符集,则根据设置的语言来选择对应的字符集,没有设置语言的话就是默认语言

另外,注意一点,目前网上大部分文章说下面这个sql可以查客户端字符集,其实是错的,它的语言虽然的确是客户端语言,但他这个字符集其实是数据库的字符集

select userenv('language') from dual

image.png
image.png

官网的说明
image.png

暂无图片 评论
暂无图片 有用 2
Thomas

DarkAthena,

select value from v$nls_parameters where parameter='NLS_CHARACTERSET'

select userenv('language') from dual;

得到的都是DB端字符集。换言之,alter session set NLS_CHARACTERSET='xxx'; 这句应该执行会报错的。就是说客户端连入后,就无法改当前session字符集,对吧。如果运行

select value from nls_session_parameters where parameter='NLS_CHARACTERSET';

查询无记录,是否也印证了无法在session里修改其值?

暂无图片 评论
暂无图片 有用 0
DarkAthena
2022-01-17
是的,在会话里去改会话字符集,会报错"ORA-00922: 选项缺失或无效"。在nls客户端参数视图和nls会话参数视图里都没有字符集参数。
DarkAthena
2022-01-17
>NLS_LANG cannot be changed by ALTER SESSION, NLS_LANGUAGE and NLS_TERRITORY can. However NLS_LANGUAGE and /or NLS_TERRITORY cannot be set as "standalone" parameters in the environment or registry on the client.
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏