Oracle修改字符集

背景:公司给更换了配置较高的笔记本,所以一切软件又要重新安装了,也是又一次翻着百度安装Oracle,技术不到家也好,保险也罢,我实在是怕错了一步,又要卸载了从头再来,卸载干净Oracle实在是太恶心。在其中的一步,由于我忘记原来备份的数据库是以什么字符集存储的,就手贱的把正在安装的字符集更换成了“UTF8”,而原来的字符集是默认的,so,就有了这篇文章。原谅小白昏头昏脑的这一波操作。


修改服务端数据库字符集

由于我的数据端本身就是在自己的电脑上安装着,所以就不存在什么远程操作了。倘若要修改虚拟机或是其他PC上的数据库字符集,那还是要SSH到远程位置进行操作。

  1. 查询目前数据库所使用的字符集(可直接在plsql中执行以下语句):

select * from V$NLS_PARAMETERS;

其中查询结果中 “NLS_CHARACTERSET” 的值即为目前所使用的,大部分都为“ZHS16GBK”或“AL32UTF8”的其中一种。我的结果如下图(我已经修改回来了):

查询结果.png

原来的值为“AL32UTF8”,我要改成图中的结果。

  1. 修改字符集(将“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;
  • 再次执行查询字符集语句,可看到修改结果。
  1. 修改环境变量。
    我使用的是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、的窃窃私语博客


  1. 在这种模式下,服务器端只有拥有dba角色的用户和具有restrict session权限的用户才能连接数据库;在远程无论拥有什么角色都无法连接。在数据库做运维(变更)的情况下且不想其他会话连接到数据库,那么可以使用此种方式,避免其他用户连接。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容