不知道全国有多少数据系统被 Oracle 数据库的 VARCHAR2(X) 的默认单位给坑了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
laminux29

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

  •  
  •   laminux29 Apr 30 669 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     2455 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 09:04 PVG 17:04 LAX 02:04 JFK 05:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86