循序渐进Oracle:数据库的字符集和字符集文件
导读:本文来自『墨天轮』专栏“循序渐进Oralcle”(https://www.modb.pro/topic/6289,复制到浏览器中打开或者点击“阅读原文”),介绍《循序渐进Oracle》第三章的3.1-3.4节:字符集的基本知识、数据库的字符集、字符集文件及字符支持、NLS_LANG的设置与影响、导入导出及字符转换。
CREATE DATABASE "eygle"
MAXINSTANCES 8 MAXLOGHISTORY 1 MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100
DATAFILE SIZE 300M AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE SIZE 120M AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE SIZE 20M AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
SMALLFILE UNDO TABLESPACE "UNDOTBS1" DATAFILE SIZE 200M AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16
……
以上用粗体显示的就是数据库的字符集和国家字符集设置。
在创建数据库的过程中,一定要注意选择字符集。对于简体中文平台,一般缺省的字符集是ZHS16GBK。一旦字符集选定了,数据库中能够存储的字符就受到了限制,所以选择字符集应该尽可能多地容纳所有将用到字符。
常见的中文字符集有:
ZHS16GBK GBK 16-bit Simplified Chinese MB, ASCII, UDC
SQL> select dump('盖') from dual;
DUMP('盖')
---------------------
Typ=96 Len=2: 184,199
SQL> select concat(to_char(184,'xx'),to_char(199,'xx')) from dual;
CONCAT
------
b8 c7
这个过程完全可逆,在同样字符集的数据库中,可以进行如下转换:
TO_NUMBER('B8C7','XXXXXX')
--------------------------
47303
SQL> select chr(47303) from dual;
CH
--
盖
C:\oracle\10.2.0\nls\data>dir lx20354.nlb
2006-10-10 14:52 477,772 lx20354.nlb
C:\oracle\10.2.0\nls\data>move lx20354.nlb lx20354.nlb.b
C:\oracle\10.2.0\nls\data>net start oracleserviceeygle
OracleServiceEYGLE 服务正在启动 ...
OracleServiceEYGLE 服务已经启动成功。
C:\oracle\10.2.0\nls\data>sqlplus "/ as sysdba"
Error 5 initializing SQL*Plus
NLS initialization error
以上测试显示,当字符集文件被移除之后,由于不能正常读取字符集文件,SQL*Plus已经不能正常登录,此时可以修改NLS_LANG参数设置其他字符集,使得SQL*Plus可以完成初始化:
C:\oracle\10.2.0\nls\data>sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.3.0 - Production on Mon Jun 18 17:10:46 2007
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
ERROR:
ORA-03113: end-of-file on communication channel
[oracle@wapdb ~]$ strace -o sqlplus.log sqlplus /nolog
SQL*Plus: Release 11.1.0.6.0 - Production on Mon Sep 27 10:23:52 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
SQL> exit
过滤一下跟踪文件,可以得到SQL*Plus启动依次调用的字符文件:
open("/opt/oracle/product/11.1.0/nls/data/lx1boot.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx00001.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx20354.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx10035.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx20001.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx40001.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx10001.nlb", O_RDONLY) = 8
E:\>set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
E:\>sqlplus "/ as sysdba"
连接到:Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
SQL> select sysdate from dual;
SYSDATE
----------
01-11月-03
已选择 1 行。
当LANGUAGE设置为American时,提示信息等是英文输出:
E:\>sqlplus "/ as sysdba"
Connected to:Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
SQL> select sysdate from dual;
SYSDATE
---------
01-NOV-03
1 row selected.
[oracle@wapdb ~]$ env|grep NLS
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
传统的导入和导出工具(IMP/EXP)是客户端软件,同SQL*PLUS和Oracle Forms一样,因此,使用EXP/IMP工具将同样按照NLS_LANG定义的方式调用字符集文件,并且在服务器和客户端之间根据设置进行字符集转换:
[oracle@wapdb ~]$ strace -o exp.log exp
Export: Release 11.1.0.6.0 - Production on 星期一 9月 27 10:39:05 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Username:
Password:
[oracle@wapdb ~]$ grep nls exp.log
open("/opt/oracle/product/11.1.0/nls/data/lx1boot.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx00023.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx20354.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx10035.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx20001.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx00001.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx10001.nlb", O_RDONLY) = 3
open("/opt/oracle/product/11.1.0/nls/data/lx207d0.nlb", O_RDONLY) = 9
E:\nls2>set NLS_LANG=AMERICAN_AMERICA.US7ASCII
执行导入操作:
Import: Release 8.1.7.1.1 - Production on Fri Nov 7 00:59:22 2003
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Connected to: Oracle8i Enterprise Edition Release 8.1.7.1.1 - Production
With the Partitioning option
JServer Release 8.1.7.1.1 - Production
这时导入,在DMP文件和NLS_LANG之间不需要进行字符集转换,但是由于导出文件字符集和数据库字符集(ZHS16GBK)不同,在数据导入Server时需要进行转换。
import done in US7ASCII character set and ZHS16GBK NCHAR character set
import server uses ZHS16GBK character set (possible charset conversion)
export server uses UTF8 NCHAR character set (possible ncharset conversion)
. . importing table "TEST" 2 rows imported
Import terminated successfully without warnings.
E:\nls2>set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
导入Session字符集设置为ZHS16GBK,导入US7ASCII的导出文件:
Import: Release 8.1.7.1.1 - Production on Fri Nov 7 00:38:55 2003
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Connected to: Oracle8i Enterprise Edition Release 8.1.7.1.1 - Production
With the Partitioning option
JServer Release 8.1.7.1.1 - Production
IMP-00016: required character set conversion (type 1 to 852) not supported
IMP-00000: Import terminated unsuccessfully
Export file created by EXPORT:V08.01.07 via conventional path
import done in US7ASCII character set and ZHS16GBK NCHAR character set
import server uses ZHS16GBK character set (possible charset conversion)
export server uses UTF8 NCHAR character set (possible ncharset conversion)
. . importing table "TEST" 2 rows imported
Import terminated successfully without warnings.
这时候经过第一步转换后的数据,US7ASCII到ZHS16GBK丢失首位,原样插入数据库,可以看到这时数据库中存放的就是错误的字符(在后面部分做了详细的转换):
Connected to:Oracle8i Enterprise Edition Release 8.1.7.1.1 - Production
With the Partitioning option
JServer Release 8.1.7.1.1 - Production
SQL> select * from test;
NAME
--------------------
2bJT
test
原文:https://www.modb.pro/topic/6289(复制到浏览器中打开或者点击“阅读原文”)
出处:
扩展阅读
数据和云小程序『DBASK』在线问答,随时解惑 欢迎了解和关注。
数据和云
ID:OraNews
如有收获,请划至底部,点击“在看”,谢谢!
资源下载
关注公众号:数据和云(OraNews)回复关键字获取
help,30万+下载的完整菜单栏
2019DTCC,数据库大会PPT
2018DTCC , 数据库大会PPT
2018DTC,2018 DTC 大会 PPT
ENMOBK,《Oracle性能优化与诊断案例》
DBALIFE,“DBA 的一天”海报
DBA04,DBA 手记4 电子书
122ARCH,Oracle 12.2体系结构图
2018OOW,Oracle OpenWorld 资料
云和恩墨BethuneX 企业版,集监控、巡检、安全于一身,你的专属数据库实时监控和智能巡检平台,漂亮的不像实力派,你值得拥有!
云和恩墨zData一体机现已发布超融合版本和精简版,支持各种简化场景部署,零数据丢失备份一体机ZDBM也已发布,欢迎关注。
云和恩墨大讲堂 | 一个分享交流的地方
长按,识别二维码,加入万人交流社群
请备注:云和恩墨大讲堂
循序渐进Oracle:数据库的字符集和字符集文件相关推荐
- MySQL 批量修改数据库的字符集和排序规则
推荐阅读 Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506 Helm3(K8S 资源对象管理工具)博客专栏:https: ...
- mysql选择排序规则_关于mysql创建数据库中字符集和排序规则的选择
1:字符集: 一般 主要选择两种: 1:utf8 (看unicode编码区从1 - 126就属于传统utf8区,),一般都够用,除非需要存储特殊字符 2:utf8mb4(utf8mb4兼容utf8 ...
- oracle sh文件怎么打开,Oracle数据库逻辑备份的SH文件
该Oracle教程将告诉诸位学习Oracle的朋友:Oracle数据库逻辑备份的SH文件. 完全备份的SH文件:exp_comp.sh rq=` date +"%m%d" ` su ...
- mysql字符集和表字符集_设置数据库的字符集和设置表字段字符集的区别是什么?...
对于oracle来说,只有数据库字符集这个说法,不存在什么表字符集和字段字符集.你说的这个是mysql的字符集,数据库字符集可以和表字符集不同,也可以和列字符集不同,也就是说,你的数据库字符集为utf ...
- 创建数据库,指定数据库的字符集和编码顺序
创建数据库,指定它的字符集和编码顺序 create database {数据库名称} CHARACTER SET {字符集} COLLATE {排序规则} 举例: create database co ...
- navicat如何配置链接mysql并且新建数据库设置字符集和排列规则
首先我们大家必须先安装好navicat软件,安装完成之后我们点击windows窗口可以看到有Navicat应用图标. 然后我们将Navicat设置桌面快捷键,设置完成之后我们在桌面上就可以看到有nav ...
- MySQL数据库——MySQL字符集和校对规则详解
在讲解字符集和校对规则之前,我们先来简单了解一下字符.字符集和字符编码. 字符(Character)是计算机中字母.数字.符号的统称,一个字符可以是一个中文汉字.一个英文字母.一个阿拉伯数字.一个标点 ...
- oracle数据库是db还是dbnms,Oracle数据库中各种类型的文件损坏与修复过程详解(2)...
5.损坏全部联机日志 (1)故障模拟 删除日志文件:rm /u02/oradata/dbnms/*.log 关闭数据库:shutdown immediate; 启动数据库:startup; Datab ...
- Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理
如果使用 imp 命令导入 dmp 文件提示 IMP-00058: ORACLE error 12547 encountered 就是导出 dmp 文件数据库的版本和当前导入数据库的版本不匹配导致的. ...
最新文章
- Jzoj4747 被粉碎的线段树
- Git中级用户的25个提示
- 一些VC++ 系统类通用类
- CPU核数跟多线程的关系
- 200 道算法面试题集锦!Python 实现,含华为、BAT 等校招真题!
- linux查看磁盘挂载的三种方法
- 2053. 数组中第 K 个独一无二的字符串
- Java Collections CheckedCollection()方法与示例
- ckeditor复制html样式丢失,Ckeditor选择html无法正常使用铬浏览器
- JMS学习(三)JMS 消息结构之属性及消息体详解
- 如何让一个函数返回多个值(C#)
- mysql开启远程登录
- 单片机实验一、单片机开发环境设置
- 高速公路5G智能网联技术、方案和应用
- 阳春三月来几个python基础吧
- Latex论文用bibtex实现期刊/会议缩写
- php图片的编码是什么,jpeg是什么图像压缩编码标准
- iOS开发 swift 3dTouch实现 附代码
- 对比学习顶会论文系列-3-2
- Excel数据透视表经典教程八《创建单页/自定义字段透视表》
热门文章
- vr设备应用程序_在15分钟内构建一个VR Web应用程序
- docker 安全性_未来的Docker安全性
- (19)脚手架工具Yeoman
- es6 Class 的静态方法
- c 递归下降识别程序_程序员的算法课(3)-递归(recursion)算法
- python解题软件哪个好用_几个好用的Python数据分析工具
- java enum.isdefined_c# – Enum.IsDefined带有标记的枚举
- filter 函数 map 函数 reduce函数 介绍
- Intent.ACTION_PICK
- Linux中的redis集群搭建