oracle 中文乱码问题修复
最近在做oracle数据库迁移工作,客户这边反馈新库注释信息以及存储过程、视图等相关对象存在乱码问题,需要修复。
经过排查确认,导入数据库结构语句时字符集环境有问题导致。
解决方案:
1.查询新库数据库字符集,并Linux系统oracle用户下设置字符集环境变量。
1.1查询新库中数据库的字符集
SYS@test> select userenv('language') from dual; USERENV('LANGUAGE') ---------------------------------------------------- SIMPLIFIED CHINESE_CHINA.ZHS16GBK1.2在oracle用户下设置字符集环境变量
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"2.将之前导出用户的SQL语句在新库中执行一遍。
@/home/oracle/repair/SQL/user_name.sql3.验证表和索引创建语句及comments注释信息是否正常
获取对象定义的包为:dbms_metadata,GET_DDL函数返回创建对象的原数据的DDL语句。
dbms_metadata包中的get_ddl函数详细参数
object_type需要返回原数据的DDL语句的对象类型name对象名称schema对象所在的Schema,默认为当前用户所在所Schemaversion对象原数据的版本model原数据的类型默认为ORACLEtransformXSL-T transform. to be applied.RETURNS对象的原数据默认以CLOB类型返回dbms_metadata包中的get_ddl函数定义:
FUNCTION get_ddl ( object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform. IN VARCHAR2 DEFAULT 'DDL') RETURN CLOB;
标准格式模板
---单用户模式,针对表的类型,单个表 select dbms_metadata.get_ddl('TABLE','TABLE_NAME','OWNER') from dual; ---单用户模式,可选任意支持类型,多个表或其他对象等 select dbms_metadata.get_ddl(u.object_type,u.object_name,u.owner) from dba_objects u where u.object_type='TABLE' and u.owner='TEST'; //多个表或者其他对象名称 and u.object_name in ('','');注意:
1、如果使用sqlplus需要进行下列格式化,特别需要对long进行设置,否则无法显示完整的SQL
2、参数要使用大写,否则会查不到
---数据库参数显示设置
set line 200 set pagesize 5000 set long 90000 set feedback off set echo off1.查看数据库表的SQL:
select dbms_metadata.get_ddl('TABLE','TABLENAME','USERNAME') from dual; -----例子 select dbms_metadata.get_ddl('TABLE','ABC','TEST') from dual; -----获取单个用户下所有表的创建 -----注意仅针对用户下表较少(30左右),较多,刷屏只能看到最好几个表的创建语句 select dbms_metadata.get_ddl(TABLE,u.object_name,u.owner) from dba_objects u where u.object_type='TABLE' and u.owner='TEST'; (and rownum <30;可选)2.查看索引的SQL
select dbms_metadata.get_ddl('INDEX','INDEXNAME','USERNAME') from dual; ---例子 select dbms_metadata.get_ddl('INDEX','ABC','TEST') from dual; ----获取单个用户所有索引 select dbms_metadata.get_ddl(u.object_type,u.object_name,u.owner) from dba_objects u where u.object_type='INDEX' and u.owner='TEST';3.针对表的注释信息
select TABLE_NAME,COLUMN_NAME,COMMENTS from dba_col_comments where owner='QUEST_SM' and COMMENTS is not null;
----------查询单个表注释信息 select TABLE_NAME,COMMENTS from dba_tab_comments where owner='TEST' and TABLE_NAME='ABC'; ----------查询单个用户所有表注释信息且注释信息不为空 select TABLE_NAME,COMMENTS from dba_tab_comments where owner='QUEST_SM' and COMMENTS is not null; ----------查询所有用户所有表注释信息且注释信息不为空 select TABLE_NAME,COMMENTS from dba_tab_comments where COMMENTS is not null; ----------模糊查询所有用户所有表注释信息包含“??” ----------快速筛选有乱码的表 select OWNER,TABLE_NAME,COMMENTS from dba_tab_comments where COMMENTS like '?%';4.针对表的列的注释信息
----------查询单个表列注释信息 select TABLE_NAME,COMMENTS from dba_col_comments where owner='TEST' and TABLE_NAME='ABC'; ----------查询单个用户所有表列注释信息且注释信息不为空 select TABLE_NAME,COMMENTS from dba_col_comments where owner='QUEST_SM' and COMMENTS is not null; ----------查询所有用户所有表列注释信息且注释信息不为空 select TABLE_NAME,COMMENTS from dba_col_comments where COMMENTS is not null; ----------模糊查询所有用户所有表列注释信息包含“??” ----------快速筛选有乱码的表 select OWNER,TABLE_NAME,COMMENTS from dba_col_comments where COMMENTS like '?%';