Oracle 编码转换及相关问题

项目上要用到 oracle,于是乎又重新装了一个 oracle 11g,中间遇到一些小问题,在此记录。由于 oracle 系的产品一直不是很熟悉,以下的记录只是一些个人观点,有理解偏差的地方欢迎指正。

首先是安装,这个没什么可说的,第一步的邮件通知貌似需要连接国外服务器,在中国由于 GFW 的存在,不能正常使用。第二步会有一个选择字符集的选项,根据需要选择,最好同一项目组的数据库字符集保持一致。还有一个就是这里有个密码选项,这里是 sys 的密码。然后一路 next,到最后创建数据库的时候,会弹出一个用户列表,这里取消 scott 的默认禁用勾选项,设置密码。然后 system 用户也设置个密码就可以了。服务器安装完成后把 client 也安装了,这样再使用 navicat 连接和操作会比较方便,特别是像我这样的小白,有个图形化的界面,执行sql的时候就多了不少底气(基本命令忘记了可以直接 GUI 界面操作,哈哈:)顿时感觉一股弱者的气息~~)。

安装完成后遇到第一个坑,由于个人习惯,数据库的字符集在安装时候选择了 AL32UTF8 编码,然后原始数据存放的数据库,用的很可能是默认安装的,结果是默认的 ZHS16GBK 编码。在导入时候由于字节长度不一致,很多数据由于超出 UTF8 的长度导致无法导入。关于具体区别可以参考这篇文章

GBK的文字编码是双字节来表示的,即不论中、英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。

至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF-8节省空间。

GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符。

GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)
UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。
比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。 所以,对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。

UTF8是国际编码,它的通用性比较好,外国人也可以浏览论坛,GBK是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大

为保证数据正确导入,需要进行数据库的编码转换操作。具体操作过程如下(上班好累,有些英文的资料懒得翻译了):

  1. 使用任意账户登录 sql plus.
  2. 在登陆状态下切换到 sys 账户进行登陆。
    CONNECT SYS/密码 as sysdba
  3. 关闭数据库
    shutdown immediate;
  4. 启动数据库到 mount 状态
    startup mount;
  5. start a SQL trace for the current session
     alter session set sql_trace=true;
  6. 修改权限。(this command will put the db in restricted session. Typically, all users with the CREATE SESSION system privilege can connect to an open database. Opening a database in restricted mode allows database access only to users with both the CREATE SESSION and RESTRICTED SESSION system privilege; only database administrators should have the RESTRICTED SESSION system privilege.)
    alter system enable restricted session;
  7. JOB_QUEUE_PROCESSES specifies the maximum number of job slaves per instance that can be created for the execution of DBMS_JOB jobs and Oracle Scheduler (DBMS_SCHEDULER) jobs. DBMS_JOB and Oracle Scheduler share the same job coordinator and job slaves, and they are both controlled by the JOB_QUEUE_PROCESSES parameter.

    If the value of JOB_QUEUE_PROCESSES is set to 0, then DBMS_JOB jobs and Oracle Scheduler jobs will not run on the instance.

    alter system set job_queue_processes=0;
  8. 打开数据库
    alter database open;
  9. 修改数据库编码
    alter database character set internal_use ZHS16GBK;
  10. 再关闭数据库以便设置生效
    shutdown immediate;
  11. 重新开启数据库
    startup

完成后再次执行导入命令

 imp scott/tiger@databasename file=d:\outdata.dmp full=y

注意如果是本地的话 @databasename 貌似并不用写的样子~

可以发现导入成功了。

然后发现 navicat 突然连接不上了,报错

ora-28547:连接服务器失败,可能是 Oracle Net 管理失败

打开 navicat 的设置(工具-选项-其他-OCI),点击下拉按钮,会自动提示安装的 oracle client 安装路径下的OCI文件,例如

D:\app\UserName\product\11.2.0\client_1\bin\oci.dll

再次连接就能正常连接了。

想到接下来要倒腾 oracle ,心里真是好慌啊 T_T,不过这也是成长的机会,加油!向着全栈方向努力前进!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>