oracle字符集总结

2023-11-07

字符集总结
author:skate
time:2007-12-4

最近公司的数据库要迁移,所以就此机会总结下字符集的知识,以便自己对字符集更全面,更深入的认识。用了

一小天的时间,我是边测试边写,

1.
什么是oracle字符集

  Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构,允许你使用本地化语言来存储,处理,检索数据。它是数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。


NLS_LANG
 
  这个参数很重要,直接影响数据库字符集,它的格式如下:

  NLS_LANG = language_territory.charset

  它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:

  Language 指定服务器消息的语言
    territory 指定服务器的日期和数字格式
    charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK

  从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文


2.
查询oracle数据库的字符集
在我们做数据导入的时候,因为字符集的原因不能正确导入,主要涉及三方面的原因,
 一是 oracle server的字符集
 二是 oracle client的字符集
 三是 dmp字符集

如果要正确导入数据,要保证这三个字符集相同

1)查询oracle server端字符集
  sql> select userenv('language') language from dual;

 
LANGUAGE                                            
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS32GB18030               

1 rows selected


2)查询dmp的字符集

 用oracle的exp导出的dmp字符集包含了字符集的信息,dmp的第2,3个字符就是dmp的字符集信息,如果dmp文件比较小,我们可以用UltraEdit(16进制)工具打开,例如第2,3字节是0354,那么我们可以用sql查出对应的字符集

 sql> select nls_charset_name(to_number(0354,'xxxx')) charset from dual

CHARSET                                 
----------------------------------------
ZHS16GBK                                

1 rows selected

相反如果我知道字符集,我怎么能知道它对应的16进制数呢?我们还是通过sql来查到

  sql> select to_char(nls_charset_id('ZHS16GBK'),'xxxx') id from dual

  ID   
-----
  354

1 rows selected

这样得到0354,然后用0354替换dmp的第2,3个字节,这样就达到改变dmp的字符集,进而欺骗oracle,以完成数据的导入

但是如果文件很大,再用UltraEdit就打不开了,可以用linux命令:

cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

 

3
字符集的转换

严格来讲,数据库的字符集是在创建数据库时选择的,一旦数据库创建好,就不能在更改字符集了,除非重新安装数据库,但是也不是一定要重装数据库,可以有变通的办法完成字符集的转换

单字节=>单字节
多字节=>多字节
且是子集到超集时,可以用alter database CHARACTER set newcharset 更新字符集;

但是,通常对于单字节向多字节转换和非子集到超集转换时采用exp/imp+internal_use的方法


SQL> select * from v$nls_parameters;

PARAMETER                                                        VALUE
---------------------------------------------------------------- ---------------
NLS_LANGUAGE                                                     AMERICAN
NLS_TERRITORY                                                    AMERICA
NLS_CURRENCY                                                     $
NLS_ISO_CURRENCY                                                 AMERICA
NLS_NUMERIC_CHARACTERS                                           .,
NLS_CALENDAR                                                     GREGORIAN
NLS_DATE_FORMAT                                                  DD-MON-RR
NLS_DATE_LANGUAGE                                                AMERICAN
NLS_CHARACTERSET                                                 WE8ISO8859P1
NLS_SORT                                                         BINARY
NLS_TIME_FORMAT                                                  HH.MI.SSXFF AM

PARAMETER                                                        VALUE
---------------------------------------------------------------- ---------------
NLS_TIMESTAMP_FORMAT                                             DD-MON-RR HH.MI
NLS_TIME_TZ_FORMAT                                               HH.MI.SSXFF AM
NLS_TIMESTAMP_TZ_FORMAT                                          DD-MON-RR HH.MI
NLS_DUAL_CURRENCY                                                $
NLS_NCHAR_CHARACTERSET                                           UTF8
NLS_COMP                                                         BINARY
NLS_LENGTH_SEMANTICS                                             BYTE
NLS_NCHAR_CONV_EXCP                                              FALSE

19 rows selected.

SQL>

将数据库启动到RESTRICTED模式下做字符集更改:
SQL> conn /as sysdba
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area  236000356 bytes
Fixed Size                   451684 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
SQL> ALTER SESSION SET SQL_TRACE=TRUE;//语句跟踪
System altered.
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;

System altered.

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

System altered.

SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;

System altered.

SQL> alter database open;
 
Database altered.

SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTER DATABASE CHARACTER SET ZHS16GBK
*
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set


提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:

SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;

Database altered.

SQL> select * from v$nls_parameters;

PARAMETER                                                        VALUE
---------------------------------------------------------------- ---------------
NLS_LANGUAGE                                                     AMERICAN
NLS_TERRITORY                                                    AMERICA
NLS_CURRENCY                                                     $
NLS_ISO_CURRENCY                                                 AMERICA
NLS_NUMERIC_CHARACTERS                                           .,
NLS_CALENDAR                                                     GREGORIAN
NLS_DATE_FORMAT                                                  DD-MON-RR
NLS_DATE_LANGUAGE                                                AMERICAN
NLS_CHARACTERSET                                                 ZHS16GBK
NLS_SORT                                                         BINARY
NLS_TIME_FORMAT                                                  HH.MI.SSXFF AM

PARAMETER                                                        VALUE
---------------------------------------------------------------- ---------------
NLS_TIMESTAMP_FORMAT                                             DD-MON-RR HH.MI
NLS_TIME_TZ_FORMAT                                               HH.MI.SSXFF AM
NLS_TIMESTAMP_TZ_FORMAT                                          DD-MON-RR HH.MI
NLS_DUAL_CURRENCY                                                $
NLS_NCHAR_CHARACTERSET                                           UTF8
NLS_COMP                                                         BINARY
NLS_LENGTH_SEMANTICS                                             BYTE
NLS_NCHAR_CONV_EXCP                                              FALSE

19 rows selected.


重启检查是否更改完成:

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  236000356 bytes
Fixed Size                   451684 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
Database mounted.
Database opened.
SQL> select * from v$nls_parameters;

PARAMETER                                                        VALUE
---------------------------------------------------------------- ---------------
NLS_LANGUAGE                                                     AMERICAN
NLS_TERRITORY                                                    AMERICA
NLS_CURRENCY                                                     $
NLS_ISO_CURRENCY                                                 AMERICA
NLS_NUMERIC_CHARACTERS                                           .,
NLS_CALENDAR                                                     GREGORIAN
NLS_DATE_FORMAT                                                  DD-MON-RR
NLS_DATE_LANGUAGE                                                AMERICAN
NLS_CHARACTERSET                                                 ZHS16GBK
NLS_SORT                                                         BINARY
NLS_TIME_FORMAT                                                  HH.MI.SSXFF AM

PARAMETER                                                        VALUE
---------------------------------------------------------------- ---------------
NLS_TIMESTAMP_FORMAT                                             DD-MON-RR HH.MI
NLS_TIME_TZ_FORMAT                                               HH.MI.SSXFF AM
NLS_TIMESTAMP_TZ_FORMAT                                          DD-MON-RR HH.MI
NLS_DUAL_CURRENCY                                                $
NLS_NCHAR_CHARACTERSET                                           UTF8
NLS_COMP                                                         BINARY
NLS_LENGTH_SEMANTICS                                             BYTE
NLS_NCHAR_CONV_EXCP                                              FALSE

19 rows selected.

 


在Oracle9i中,如果数据库存在CLOB类型字段,那么就不允许对字符集进行转换

对于不同情况,Oracle提供不同的解决方案,如果是用户数据表,一般我们可以把包含CLOB字段的表导出,然后drop掉相关对象,
转换后再导入数据库;对于系统表,可以按照以下方式处理:

 

SQL> truncate table Metastylesheet;

 Table truncated.
  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oracle字符集总结 的相关文章

  • 更好地理解 SQL Server 中的架构

    就像标题一样 我还是一个SQLServer菜鸟 当我创建表 Mytable 时 数据库中显示 dbo Mytable 但有人能让我更好地理解模式吗 另外 在 Server 2008 TSQL 一书中 Itzik 说 在你的数据库中 表属于模
  • 如何用约束标记一大组“传递群”?

    在 NealB解决方案之后进行编辑 与以下解决方案相比 NealB的解决方案非常非常快任何另一个 https stackoverflow com q 18033115 answers and 提出了关于 添加约束以提高性能 的新问题 Nea
  • Oracle:按月分区表

    我的解决方案 德语几个月 PARTITION BY LIST to char GEBURTSDATUM Month PARTITION p1 VALUES JANUAR PARTITION p2 VALUES Februar PARTITI
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013
  • oracle ExecuteNonQuery 在 ASP.Net 上冻结

    我正在尝试使用 ASP C 和 CLR 4 5 中的 Oracle 连接来运行非查询 这是我的代码 string connectionString ConfigurationManager ConnectionStrings OracleC
  • 表与多个表具有一对一的关系

    1 一个表可以和多个表建立一对一的关系吗 为了更清楚地说明 如果我想做插入 第一个表将受到影响并且 只有一张其他表会受到影响 2 如果是这样 主键将如何 3 另外 如果我想检索多条记录 查询会是什么样子 从这些表中 谢谢 一个表可以和多个表
  • SQL 标准是否允许函数名和括号之间有空格

    检查一些 RDBMS 我发现类似的事情 SELECT COUNT a SUM b FROM TABLE 允许 注意聚合函数和括号之间的空格 谁能提供一个指向 SQL 标准本身定义的指针 任何版本都可以 编辑 以上在postgres中工作 m
  • postgresql 不同的不工作

    我使用以下代码从数据库获取值 但是当我编写这段代码时 测试看看问题出在哪里 我注意到查询没有从数据库中获取不同的值 这是查询 select distinct ca id as id acc name as accName pIsu name
  • 插入具有只读主键列的表

    我正在使用一个使用 sql server 数据库的应用程序 我试图在表中插入一行 如下所示 该表有一个主键 prodNum 这是自动生成的密钥 当我尝试向表中插入一行时 如下所示 在行中intResult oSglProdTableAdap
  • SQL Server使用in关键字传递字符串数组查询

    我认为 IN 子句不能接受具有多个值的绑定参数 Oracle 不能 需要几分钟 查询是 declare setting varchar max set setting Sales Entry Grid Cursor Customer Man
  • 如何使用Java获取特定模式的所有表及其列?

    我有一个数据库架构 其名称为 Navid 这个模式中有很多表 当然每个表都有一些列 我需要的是一个java类 连接到我的数据库 有一个在所有表上循环的方法 2 1 有一个内部循环来定义表的所有列 制作创建表查询语句 我想在另一个数据库中创建
  • 存储过程错误 PLS-00201:必须声明标识符“UTL_HTTP”

    我正在尝试创建一个从服务请求一些 XML 数据的存储过程 我在网上找到了几个示例 它们都指向使用这个 UTL HTTP 包 但是 每次我尝试用它来编译我的存储过程时 我都会收到错误 PLS 00201 identifier UTL HTTP
  • 支持 >65k 行的 Excel VBA SQL 驱动程序

    在 Excel 2010 中通过 VBA 查询 Excel 数据时 我遇到一个有趣的问题 我正在使用这些驱动程序连接到 xls 或 xls x m 文件 Sub OpenCon ByRef theConn As Connection ByV
  • 无法与重定向器建立连接。确保“sql browser”服务正在运行

    所以我尝试这个 sql server 2012 由于这个错误我无法打开任何 ssis 包 无法与重定向器建立连接 确保 sql browser 服务正在运行 我的 Sql 浏览器肯定正在运行 我尝试在本地服务 本地系统和网络下更改它 仍然没
  • 是否可以从子查询中获取多个值?

    有没有办法让子查询在oracle db中返回多列 我知道这个特定的sql会导致错误 但它很好地总结了我想要的 select a x select b y b z from b where b v a v from a 我想要这样的结果 a
  • 计算2个日期之间每个日期的记录数

    我必须创建一个查询来返回多轴图表的结果 我需要计算为 2 个日期之间的每个日期创建的 ID 数量 我试过这个 DECLARE StartDate datetime2 7 11 1 2020 EndDate datetime2 7 2 22
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 如何使用 ADO 连接字符串以 SYS 身份连接到 Oracle 数据库?

    我正在尝试这个 Provider MSDASQL 1 Persist Security Info False User ID sys Password pwd Initial Catalog DATABASE Data Source Odb
  • 总和和不同不会改变结果?

    我是一个新手 试图在这里解决这个问题 到目前为止还没有运气 非常感谢任何帮助 Select Distinct AB agency no ab branch no AS AGENCY BRANCH count AB agency no ab

随机推荐

  • 在 Linux 中查找文件的 4 种方式

    Preface 4 种命令方式 locate 系统数据库内部索引 适合找历史数据 全 whereis 所有二进制文件 which 环境变量内的二进制文件 find home type f b c d l name test txt 在哪找什
  • 标准IO函数练习

    一 使用fgets实现计算一个文件有几行 include
  • 数字钟24小时制:Multisim仿真(百度网盘)分享

    图如下 链接 https pan baidu com s 19r3razNjIso 2vYB64FcKA 提取码 vqwx
  • 一文入门Go静态单赋值(SSA)

    在上一篇文章 通过实例理解Go内联优化 1 中 我们探讨了Go编译器在编译中端进行的内联优化 内联优化基于IR中间表示进行 不过Go编译过程不止有一种IR表示 这点和龙书 编译原理 第二版 2 的在第六章 中间代码生成 一开始处的讲解是一致
  • 浪漫七夕

    迢迢牵牛星 皎皎河汉女 这一句古老的诗句 映照着那悠远的星空 千百年来 牛郎织女的爱情传说代代传承 唤起人们对纯真爱情的向往 岁月流转 这段美丽的传说孕育出七夕节 是一个祈福许愿 象征爱情的节日 更是我们中国人专属的情人节 不论是情侣还是夫
  • 基于SSM框架的员工管理系统

    一 视频展示 https www bilibili com video BV1xM4y1K71m 二 基本介绍 1 关键技术 开发工具 IntelliJ IDEA 数据库 MySQL 5 7 前端技术 Jquery Bootstrap JS
  • 7个Facebook营销技巧:让你的产品轻松出圈!

    据统计 当前Facebook的月活跃用户为29 34亿 是全球最为活跃的社交媒体平台 跨境电商卖家利用好这个平台 可以让自己的产品给更多人看到 如果你还不知道怎么才能用好Facebook做营销推广 那就接着往下看吧 加入Facebook群组
  • jQuery将json字符串转换为数组

    简单的jQuery代码片段将JSON字符串转换为对象数组 然后插入其值的输出 var data JQUERY4U DASHBOARD data widgets data parseJSON data each data function i
  • CVPR冠军方案分享

    近日 全球三大计算机视觉顶级会议之一CVPR如期举行 深兰科技DeepBlueAI团队斩获TinyAction Challenge 低分辨率视频行为识别挑战赛 的冠军 TinyAction Challenge是第六届动作识别国际挑战赛系列竞
  • PC市场逆势复苏之路:创新与多元化引领未来

    市场调研机构Canalys数据显示 今年一季度 中国市场整体PC出货量同比下降24 至890万台 已是连续第五个季度下跌 今年截至618结束 都没有一家主要的PC厂商愿意发战报 PC市场怎样走出寒冬 谈谈你的理解和看法 一 2022年下半年
  • hihoCoder_A+B

    A B Problem 描述 求两个整数A B的和 输入 输入包含多组数据 每组数据包含两个整数A 1 A 100 和B 1 B 100 输出 对于每组数据输出A B的和 样例输入 1 2 3 4 5 6 样例输出 3 7 11 inclu
  • Unity鼠标控制3D物体的移动、旋转、缩放

    一 鼠标控制3D物体移动 1 使用协程 using System Collections using System Collections Generic using UnityEngine public class ControlMove
  • 使用OpenSSL做RSA签名验证 支付宝移动快捷支付 的服务器异步通知

    由于业务需要 我们需要使用支付宝移动快捷支付做收款 支付宝给了我们 移动快捷支付应用集成接入包支付接口 见支付宝包 WS SECURE PAY SDK 支付宝给的服务器demo只有Java C PHP三种 而我们服务器端使用的是C 这其中就
  • 建立ftp文件服务器群,2.1.6FTP文件服务器搭建.docx

    文件服务器 FTP 配置说明 FTP安装及基本配置 FileZillaServer软件安装 FileZilla Server的安装相对简单 一路按照默认安装即可 如图1 1至图1 8所示 图1 1 点击 I Agree 图1 2 点击Nex
  • echarts在vue中使用不报错,但是不显示

    没有设置div标签的宽和高 div class charts div charts width 900px height 500px
  • 一些神奇好用的网站

    文章目录 1 ilovepdf 2 Google Scholar 镜像 3 LetPub 4 Connected Papers 5 Overleaf 1 ilovepdf 网址 https www ilovepdf com 功能 PDF文件
  • Mysql如何定位慢查询(面试题)

    Mysql如何定位慢查询 面试题 相关概念 慢查询分析 慢查询工具定位 Arthas Prometheus Skywalking Mysql慢查询日志 相关概念 分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划 还可以
  • 宝尊+艺康 面经

    baozun 研发岗 线下专场面试 宣讲之后现场笔试 笔试都是选择题 不难 38道题 30小题基础知识 比较广 8道推理题 数学推理和图形推理 图形难度大 笔试完之后等叫名字就去和面试官谈话 估计是根据笔试成绩 成绩高的先被叫去 每次面试基
  • TVS的典型应用(图文详解)

    TVS瞬态电压抑制二极管 是一种采用半导体工艺制成的单个PN 结或多个PN结集成的高效型电路保护器件 TVS内部芯片为半导体硅材料 具有很高的可靠性 响应速度快 低动态内阻 低钳位电压 电压精度高 击穿电压一般为 5 的偏差 封装多样化 贴
  • oracle字符集总结

    字符集总结author skatetime 2007 12 4 最近公司的数据库要迁移 所以就此机会总结下字符集的知识 以便自己对字符集更全面 更深入的认识 用了 一小天的时间 我是边测试边写 1 什么是oracle字符集 Oracle字符