V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
laminux29
V2EX  ›  数据库

不知道全国有多少数据系统被 Oracle 数据库的 VARCHAR2(X) 的默认单位给坑了

  •  
  •   laminux29 · Apr 30 · 731 views
    当我们建表时,使用 VARCHAR2(50),从开发的角度,可能会认为是 VARCHAR2(50 个字符),而不是 VARCHAR2(50 字节)。

    但 Oracle 数据库,如果你没写清楚 VARCHAR2(50 CHAR) 还是 VARCHAR2(50 BYTE),而只是写了 VARCHAR2(50),那么 Oracle 大概率默认行为是 VARCHAR2(50 BYTE)。

    这几天帮助同事清理数据,发现系统中有丢失数据的问题,查了失败日志,才发现是这个问题。
    不知道全国多少数据系统被 Oracle 的这个特性坑了。
    NotFoundEgg
        1
    NotFoundEgg  
       Apr 30
    这个也算 Oracle 的常识了,GBK 和 UTF8 还决定了 VARCHAR2(50) 能存多少个汉字

    之前我这边有个库是 GBK 的,非要迁数据到 UTF8 的库,好多字段都要扩
    laminux29
        2
    laminux29  
    OP
       Apr 30
    @NotFoundEgg 这是一家数据公司的拳头产品,出现了这个问题,有可能是产品设计师第一次遇到 Oracle 的这个坑,没测试、没做验证,就着急赶工地把产品做出来了。这家公司还是全国的数据行业的 TOP 3 公司,不知道他们这款产品,害了多少公司、单位与企业。

    而且这个 BUG 最诡异的地方,是它并不是一定会明显地失败,无法让开发与甲方能很明显地发现。

    BUG 触发的条件,只有当源表的 VARCHAR2(X CHAR)的字符串长度超过中间表 VARCJAR2(X BYTE)字段的 1/3 长度时,Oracle 才会报一个错误。而且,如果数据复制过程,不是批量的数据复制事务,而是一条一条的数据复制,那么丢失数据的告警,只会被淹没在成功的日志里。这时如果甲方的纪律性不强,没有去仔细看日志,那也很难发现这个问题。因为此时会有大量数据被成功复制,少数数据因这个 BUG 发生丢失问题。
    chiikawa
        3
    chiikawa  
       Apr 30
    那你还得再记多一个,Oracle 的 char 会填充空白字符到你设置的长度
    czzt1
        4
    czzt1  
       Apr 30
    这种问题已经算常识了
    laminux29
        5
    laminux29  
    OP
       Apr 30
    @chiikawa

    CHAR(n) 会自动补空白,是主流数据库的一致行为,这不是问题。

    但 Oracle 这个 VARCHAR2( N ) 的行为,明显和其他数据库不一样,这里就是巨坑。

    Mysql 与 PostgreSQL 默认单位是字符长度;

    Oracle 、MS SQL Server 、DB2 默认单位是字节;

    按照中国互联网发展史,平时用习惯 Mysql 的人,突然用 Oracle ,估计会被坑死在这个细节上。
    jackqian
        6
    jackqian  
       Apr 30
    这个刚学编程的时候就知道了。
    那个国产达梦数据库更离谱,不光是 BYTE x3 的问题,存超出范围的字符串它也不报错,直接给你截断了
    chiikawa
        7
    chiikawa  
       Apr 30
    @laminux29 #5 我说的有问题,Oracle 补充的空格查询也会查询出来,数据长度固定; MySQL 查询出来的会自动 trim ,数据长度插多少是多少
    cherryas
        8
    cherryas  
       Apr 30
    以前这种级别的迁移都需要有个 Oracle 专家来指导,最起码团队里一个人熟悉 Oracle
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2486 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 08:15 · PVG 16:15 · LAX 01:15 · JFK 04:15
    ♥ Do have faith in what you're doing.