oracle_字符集问题

如何修改字符集:
问题:前台业务反应,登陆系统界面不显示组织机构等信息,输入用户信息拼音会显示用户,选中该用户登录报无权限登陆系统。
接到反馈后:经了解,该数据库前天晚上进行了一起关闭和启动,查看数据库字符集参数,发现数据库字符集为AL32UTF8,虽然怀疑是由于字符集问题,但是考虑,该数据库很久没有关闭也没有对字符集进行修改,所以就忽略了这个点。但最终实在排查不出问题,决定修改字符集为ZHS16GBK,修改完以后,前台可以正常登录系统正常,做业务报错。经查询数据库还是报字符集问题,说明AL32UTF8没有问题,改回原字符集后,设置客户端参数NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,业务系统依旧无法登录。百思不得其解,为尽快恢复业务,最终处理方法:导出数据在导入数据,完成字符集的转换。经测试正常,恢复业务系统。
database修改字符集步骤
SQL> conn / as sysdba;
已连接。
SQL> show parameter job
SQL> show parameter aq
记录参数值。
sql>conn / as sysdba;
sql>shutdown immediate;
sql>startup mount;
sql>alter system enable restricted session;//开启会话限制(取消会话限制:alter system disable restricted session;)
sql>alter system set job_queue_processes=0;//禁用job进程(防止job运行,最好禁掉)
sql>alter system set aq_tm_processes=0;//关闭队列监视(初始值就为0,可以不用执行)
sql>alter database open;
sql>alter database character set zhs16gbk;
报:ORA-12712
sql>alter database character set internal_use ZHS16GBK;
sql>shutdown immediate;
sql>startup;
说明:1.修改字符集后,job_queue_process,aq_tm_processes 要改回原本的值。
关于字符集的几点知识,这里简单介绍:
什么叫字符集?
字符集是字符和编码的对应表,计算机中只能存储字符。
1.操作系统有字符集(windows,linux等)
2.oracle数据库本身有字符集,字符集可以认为是一张表,字符和字符编码的对应关系表。
3.软件不带字符集的时候使用系统字符集,有字符集的话,使用自己的字符集。

数据库字符集:
1.用来存储char,varchar2,clob,long等类型数据
2.用来标示诸如表名、列名、以及PL/SQL变量等
3.用来存储sql和pl/sql程序单元等

国家字符集:
1.用来存储nchar,nvarchar2,nclob等类型数据
什么时候用字符集? 即用来存储和显示字符的时候。

字符集的命名:
oracle的字符集命名遵循以下命名规则:

即,<语言><比特位数><编码>
US7ASCII:只能存储26字母,加减,数字等且不超过128
zhs16cgb231280
AL32UTF8
AF16UTF8 /通常,国家字符集
ZHS16GBK

要存中文,AL32UTF8 和 zhs16gbk
AL32UTF8会消耗更多资源,性能比zhs16gbk差一些。
什么是超集?(A,B为例说明)
A有的B都有,但字符编码可能不一样
什么是严格超集?
A有的B都有,A的字符编码和B的字符编码是一样的,为严格超集

场景1:
CLIENT: WINDOWS(A)(SQLPLUS)<------->SERVER:LINUX(B)
1.客户端有字符集,oracle 软件有字符集,linux 也有字符集
2.sqlplus 没有字符集,使用操作系统字符集
3.oracle有字符集,即不使用系统字符集
4.此结构下,所有的字符集转换都是在oracle端执行的
5.客户端往服务端写数据过程:sqlplus 中输入一个中文,被操作系统编码,这个编码从客户端传到oracle,oracle拿到编码后转成字符(oracle需要知道,接收的编码是用什么编的,oracle问客户端用什么编的码),1.如果客户端和服务端编码一致则直接存储。2.如果客户端和服务端编码不同则oracle端进行转

码然后进行编码后再存储。
6.客户端从服务端取数据:服务端问你需要什么编码,通过NLS_LANG传话说,客户端拿到编码在使用客户端OS进行转换成字符。

场景2
client(AL32UTF8)<------->SERVER(ZHS16GBK)
过程:16GBK进行转码时,找不到字符,oracle会存个?,即产生字符乱码

问题1:场景1中,所提的,oracle怎么知道客户端字符集的?
通过NLS_LANG参数:
windows:set NLS_LANG=american_america.zhs16gbk
linux:export

该参数的意义,该参数设置成16gbk,oracle就认为你是16gbk。该参数实际就是用来传话的,用来知道客户端操作系统字符集。存在传话错误的情况,该参数的设置十分重要,该参数务必设置成和客户端操作系统一致。把握这个原则,字符集一般不会出现问题。

NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
AMERICAN_AMERICA:这一块只影响sqlplus提示到底是显示什么语言,和字符没有关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值