当前位置:  数据库>oracle

Oracle字符集引发mview的问题及解决方法

    来源: 互联网  发布时间:2017-04-24

    本文导语: Oracle字符集引发mview的血案 现象:应用连接源端库可以查到数据,连接目标端查不到数据 环境: 远端字符集:utf8 分发中心字符集:utf8 目标端字符集:al32utf8 varchar2类型没有问题,但char有问题 mview同步第一种方式: 源端到分...

Oracle字符集引发mview的血案

现象:应用连接源端库可以查到数据,连接目标端查不到数据

环境:

远端字符集:utf8

分发中心字符集:utf8

目标端字符集:al32utf8

varchar2类型没有问题,但char有问题

mview同步第一种方式:

源端到分发中心:

create MATERIALIZED view tab_linuxidc Build IMMEDIATE Refresh force On demand With primary key As Select * fromtab_linuxidc@"www.linuxidc.com";

这一步没有问题

分发中心到目标端:

create MATERIALIZED view tab_linuxidc Build IMMEDIATE Refresh force On demand With primary key As Select * fromtab_linuxidc@"www.linuxidc.com";

这一步就有问题了,因为utf8(al24utf8)占3个字节,而al32utf8占4个字节,而如果源端的char(10),在目标端也占10个字节。当遇到怪癖字时,在源端可以存储,在目标端就存储不成功,导致源端和目标端不一致。

mview同步第二种方式

源端到分发中心:

create MATERIALIZED view tab_linuxidc Build IMMEDIATE Refresh force On demand With primary key As Select * fromtab_linuxidc@"www.linuxidc.com";

分发中心到目标端:

CREATE MATERIALIZED VIEW tab_linuxidc REFRESH FORCE ON DEMAND WITH PRIMARY KEY AS SELECT (SUBSTR(NAME, 1, 4)) as NAME FROMtab_linuxidc@www.linuxidc.com;

这里name字段在源端是char(4),但只存储‘1’,因为是char的原因,所以1后面带了3个空格,这样通过上面sql创建数据类型变为varchar2(16),而且数据里还带有三个空格(1后面带了3个空格);因为oracle对char后的空格,在运算时是自动删除的,oracle认为那是系统自身添加的,不是真实的数据,但是转化成varchar2后,因为varchar2是动态存储的,没有自动补齐一说。所有当有空格时,oracle就是认为这空格是真实的数据。这样用同样的sql就无法查到数据了。

解决方法

1.改变源端数据类型为varhcar2,这个对应用影响较大。

2.想办法把从分发中心到目标端同步多余的空格给截取到,可以通过(rtrim,cast),建议用cast函数。例子如下:

CREATE MATERIALIZED VIEW tab_linuxidc REFRESH FORCE ON DEMAND WITH PRIMARY KEY AS SELECT CAST(NAME as char(8)) FROMtab_linuxidc@www.linuxidc.com;

这样字段的数据类型就都一样了,而且也重新定义了目标端的字段的长度

--------end-----------


    
 
 

您可能感兴趣的文章:

  • 在Red Hat Linux 9 和 Oracle 9.2 环境下,如何配制字符集,让Oracle能存入并显示日语里的假名?
  • 查询与修改Oracle字符集
  • oracle查看字符集后修改oracle服务端和客户端字符集的步骤
  • ORACLE 10G修改字符编码没有超字符集的限制
  • apache通过php的oci函数读取Oracle(字符集ZHS16GBK)时,显示乱码,如何解决?
  • 查看和修改Oracle服务器端字符集
  • Oracle字符集修改查看方法
  • 如何在RAC环境下修改Oracle字符集
  • oracle查询字符集语句分享
  • Oracle 8i字符集乱码问题析及其解决办法
  • 最好的修改Oracle字符集文档
  • Oracle中字符集的类型决定varchar2的字符长度
  • [Oracle] 彻底搞懂Oracle字符集
  • oracle查看字符集和修改字符集使用详解
  • 深入Oracle字符集的查看与修改详解
  • oracle截取字符(substr)检索字符位置(instr)示例介绍
  • 关于Oracle BLOB类型,一个String字符怎么写入BLOB字段?
  • Oracle中SQL语句连接字符串的符号使用介绍
  • Oracle中字符串连接的实现方法
  • Oracle将字符编码从GBK转到UTF8,如何操作比较稳妥?
  • 安装oracle9的时候字符无法显示??
  • oracle查询不含括号及不含指定字符的方法
  • Linux字符安装oracle
  • 怎么用jsp向oracle8提交长字符(15000字左右)?
  • 向Oracle数据库的CLOB属性插入数据报字符串过长错误
  • 快疯了:怎样从JSP中向Oracle_816中插入LONG型字符串?
  • Linux下字符安装oracle好轻松
  • oracle使用instr或like方法判断是否包含字符串
  • Oracle用户密码含特殊字符时登陆失败问题
  • linux下字符安装oracle 10g!最后出现点问题!很急!
  • 我要向oracle中插入大文本,用的是lang类型的字段,但是只能插3000字,再多就抱错,说我字符串过长。谁遇到过此问题?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle环境变量引发“Connected to an idle instance.”错误
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,