【转帖】循序渐进Oracle:数据库的字符集和字符集文件
循序渐进Oracle:数据库的字符集和字符集文件
https://blog.csdn.net/Enmotech/article/details/100869162
导读:本文来自『墨天轮』专栏“循序渐进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(复制到浏览器中打开或者点击“阅读原文”)
【转帖】循序渐进Oracle:数据库的字符集和字符集文件的更多相关文章
- Oracle数据库表空间与数据文件的关系描述正确的是( )
Oracle数据库表空间与数据文件的关系描述正确的是( ) A.一个表空间只能对应一个数据文件 B.一个表空间可以对应多个数据文件 C.一个数据文件可以对应多个表空间 D.表空间与数据文件没任何对应关 ...
- c#用log4Net将日志写入到Oracle数据库,并写入到文件中
原文:c#用log4Net将日志写入到Oracle数据库,并写入到文件中 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https:/ ...
- oracle数据库中字符乱码
1.1 88.152 os已安装中文包,以下确认os层面中文是否可以显示 1.2 88.153 os没有安装中文包,以下确认os层面中文无法显示 1.3 ...
- mysql创建数据库指定字符集和校对规则
mysql创建数据库的语法格式: CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] ...
- Oracle数据库返回字符类型-1~1的结果处理
如果实体类中定义的字段是String类型,Oracle数据库中返回的是数字类型,那么Oracle返回0.xxx的时候会丢失前面的0. 要想不丢失0,那么数据库返回的就要是字符串类型的,所以要将返回值转 ...
- Oracle数据库导入导出总结(dmp文件)
Oracle 10G 管理页面(Oracle Enterprise Manager 10g): http://localhost:1158/em http://localhost:1158/em/co ...
- Java读取oracle数据库中blob字段数据文件保存到本地文件(转载)
转自:https://www.cnblogs.com/forever2698/p/4747349.html package com.bo.test; import java.io.FileOutput ...
- Hibernate 连接MySQL/SQLServer/Oracle数据库的hibernate.cfg.xml文件
用Hibernate配置连接数据库可以方便我们对POJO的操作,节省了很多时间和代码.下面就分别说明连接不同数据库需要在hibernate.cfg.xml做的配置. 需要数据库驱动包可以点击这里下载: ...
- Oracle数据库中字符型字段按数字排序
今天在转换数据时,遇到了一个主键排序的问题.字符型的主键,保存的都是数字,数据导过来以后发现数据排序都是乱的,就想着按数字规则排序. 但发现to_number总是报错,就想着里面应该是有字符存在.后来 ...
随机推荐
- 爬虫(八):分析Ajax请求抓取今日头条街拍美图
(1):分析网页 分析ajax的请求网址,和需要的参数.通过不断向下拉动滚动条,发现请求的参数中offset一直在变化,所以每次请求通过offset来控制新的ajax请求. (2)上代码 a.通过aj ...
- linux环境下完成jenkins的环境搭建
环境搭建部署: 请完成jenkins的环境搭建,需安装tomcat,mysql. Jenkins 地址: https://jenkins.io/download/ 步骤分析: 1.全部操作使用普通用 ...
- Jetty - Unable to compile class for JSP
问题与分析 在启动公司项目时发现报错如下: [jetty] 2019-10-07 10:28:28.760:WARN:org.apache.jasper.compiler.Compiler:Error ...
- python3监控系统资源最终版(获取CPU,内存,磁盘,网卡等信息),返回json格式。
#!/usr/bin/env python3 #-*- coding:utf-8 -*- #create at 2018-12-07 'this is a system monitor scripts ...
- java.lang.IllegalStateException: Method get not annotated with HTTP method type (ex. GET, POST);
明明指定了请求方法类型还报错: 代码: @RequestMapping(value="/enterprise/detail",method = RequestMethod.POST ...
- js小脚本解析后台数据
java代码 List<CodeTableBean> clfsList = StandardCodeTable.getCodeTable("clfs", "& ...
- BZOJ3236作业
这东西是个应用为O(logn)的莫队. 正常莫队的updata函数转移是O(1)的,可这个题时间非常宽泛,可以套两个树状数组,那两个东西很好维护,第一个直接普通权值树状数组维护,第二个开一个桶,记录当 ...
- Eclipse简明使用教程(java集成开发环境)
说明:我使用的是绿色便携版的Eclipse,免安装,解压就能用.链接:https://download.csdn.net/download/loongstyle/10700321 1_Eclipse中 ...
- appium 小程序自动化测试
https://www.cnblogs.com/yoyoketang/p/9144987.html adb shell su ACTIVITY com.tencent.mm/.plugin.appbr ...
- MySQL查询获取行号rownum
MySQL中可以使用变量产生行号,下面是2个简单例子: 使用工具:MySQL Workbench 说明:表heyf_10中字段,empid(员工工号).deptid(部门编号).salary(薪资): ...