背景:公司给更换了配置较高的笔记本,所以一切软件又要重新安装了,也是又一次翻着百度安装Oracle,技术不到家也好,保险也罢,我实在是怕错了一步,又要卸载了从头再来,卸载干净Oracle实在是太恶心。在其中的一步,由于我忘记原来备份的数据库是以什么字符集存储的,就手贱的把正在安装的字符集更换成了“UTF8”,而原来的字符集是默认的,so,就有了这篇文章。原谅小白昏头昏脑的这一波操作。
修改服务端数据库字符集
由于我的数据端本身就是在自己的电脑上安装着,所以就不存在什么远程操作了。倘若要修改虚拟机或是其他PC上的数据库字符集,那还是要SSH到远程位置进行操作。
- 查询目前数据库所使用的字符集(可直接在plsql中执行以下语句):
select * from V$NLS_PARAMETERS;
其中查询结果中 “NLS_CHARACTERSET” 的值即为目前所使用的,大部分都为“ZHS16GBK”或“AL32UTF8”的其中一种。我的结果如下图(我已经修改回来了):
原来的值为“AL32UTF8”,我要改成图中的结果。
- 修改字符集(将“AL32UTF8”更改为“ZHS16GBK”)
其实,平常我们执行sql等基本已经熟悉了plsql客户端的方式,但这个修改是要在cmd命令行中进行的。
- win+R,输入“cmd”进入命令行;
- 将数据库启动到RESTRICTED模式[1]下做字符集更改:
进入sqlplus
SQL\> sqlplus/nolog
以管理员身份登录
SQL\> conn / as sysdba
-
然后就是关闭数据库,进入限制模式,修改字符集
SQL\> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 6781128704 bytes
Fixed Size 2188608 bytes
Variable Size 3523218112 bytes
Database Buffers 3238002688 bytes
Redo Buffers 17719296 bytes
数据库装载完毕。SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
系统已更改。
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
系统已更改。
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
系统已更改。
SQL> alter database open;
数据库已更改。
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTER DATABASE CHARACTER SET ZHS16GBK*
第 1 行出现错误:
ORA-12712: 新字符集必须为旧字符集的超集此处我们使用“INTERNAL_USE ZHS16GBK”字符集来跳过子集检查。
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
数据库已更改。
- 现在我们就已经把字符集修改完毕了。重启一下数据库。
SQL> shutdown immediate;
SQL> startup;
- 再次执行查询字符集语句,可看到修改结果。
- 修改环境变量。
我使用的是Windows环境,所以直接添加系统变量。
变量名称:NLS_LANG;
变量值:SIMPLIFIED Chinese_CHINA.ZHS16GBK(你修改的值);
这样服务端的数据库字符集就修改完成了。
修改客户端数据库字符集
客户端的字符集就不涉及到数据库的命令了,主要是Oracle客户端与数据库内置不一致导致的,修改安装数据库时的注册表就可以。
- win + R,输入“regedit”进入注册表设置;
- 按照以下目录层级找到目标位置:
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraDb11g_home1/NLS_LANG
- 将这个变量的值设置为你想要修改的值即可。
这样客户端的字符集也设置完毕了。
目前字符集是设置完毕,可是原来是GBK的数据导入到了UTF8字符集的数据库里,再改回来也还是乱码,只能重新导入dmp备份文件了。下一篇就是总结的Oracle导入dmp文件的内容。
PS:目前自认技术还差的很远很远,几乎算是小白一个,所以,记录这些小的知识点不光是为了以后自己翻起来方便,而且对自己也是一种成长,也希望能帮到跟我一样的小白。我热爱这个行业,享受创造的过程,所以才需要更努力去见识更大的天空。知识浅显,还请各位莫要取笑。
参考资料:Fred、的窃窃私语博客
-
在这种模式下,服务器端只有拥有dba角色的用户和具有restrict session权限的用户才能连接数据库;在远程无论拥有什么角色都无法连接。在数据库做运维(变更)的情况下且不想其他会话连接到数据库,那么可以使用此种方式,避免其他用户连接。 ↩