V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
woodfizky
V2EX  ›  PostgreSQL

适配信创数据库的人的精神状态 be like

  •  
  •   woodfizky · 1 月 13 日 · 4757 次点击

    适配过程中发现:如果某个 SQL 的查询条件是 some_col != '',那么返回的结果就会是空

    于是做了如下简单实验: SQL

    select
        case
            when ('1' != '') then '1'
            when ('1' = '') then '2'
            else 'else'
        end as result_1,
        ('1' = '')::bool as result_2,
        ('1' != '')::bool as result_3,
        ('1' != '' or '1' = '') as always_true_1,
        ('1' != '1' or '1' = '1') as always_true_2
    

    result:

    {
      "postgres": {
        "result_1": "2",
        "result_2": false,
        "result_3": true,
        "always_true_1": true,
        "always_true_2": true
      },
      "gaussdb": {
        "result_1": "else",
        "result_2": null,
        "result_3": null,
        "always_true_1": null,
        "always_true_2": true
      }
    }
    

    完全不明白为什么 gaussdb 的逻辑是这样的,如果有人知道可以告诉我一下吗?

    第 1 条附言  ·  1 月 14 日
    感谢各位纠错,postgres 的 result_1 应该是 1 。
    DB 在内网,复制不方便,手敲敲错了,不好意思。
    28 条回复    2026-01-14 21:13:30 +08:00
    momocraft
        1
    momocraft  
       1 月 14 日   ❤️ 6
    信创要是和 postgre 一样 那创新体现在哪里 :doge:
    yeqizhang
        2
    yeqizhang  
       1 月 14 日 via Android
    刚搜了,这个数据库认为''和 null 是一样的
    hafuhafu
        3
    hafuhafu  
       1 月 14 日
    为什么 PG 的 result_1 返回"2"呢?
    应该是"1"吧。
    woodfizky
        4
    woodfizky  
    OP
       1 月 14 日 via Android
    @hafuhafu 还真是。我在内网做的查询,不太好复制出来,手敲的 result ,敲错了。
    imaple
        5
    imaple  
       1 月 14 日
    @yeqizhang 没法解释 always_true_1 变成 null 了呀
    shinession
        6
    shinession  
       1 月 14 日
    这个特性怎么像 float('nan'), 无法比较
    werls
        7
    werls  
       1 月 14 日
    华为要体现特殊性啊,虽然都是抄袭 PG 的,但也要改改的。
    hengshenyu
        8
    hengshenyu  
       1 月 14 日 via Android
    gemini 说:取决于你的 GaussDB 兼容模式配置。是这样吗?
    woodfizky
        9
    woodfizky  
    OP
       1 月 14 日 via Android
    @hengshenyu 兼容模式是 A 模式还是什么模式吧。按理说应该用 pg 兼容模式的,出于各种原因领导不让。

    但是兼容不兼容的,作为程序员看到这么反直觉的所谓特性真的很想骂人。。。
    woodfizky
        10
    woodfizky  
    OP
       1 月 14 日 via Android   ❤️ 2
    @werls 抄 PG ,还抄 Oracle 和 MySQL ,抄完把大家的缺点缝合了,还丢了点优势。

    比如这个乐子:PG 天然支持 json/jsonb 类型的 btree 索引。高斯把 btree 索引优化成 ubtree ,但是丢掉了对 json/jsonb 索引的支持。

    每次遇到这些想让我骂人的问题之后都十分好奇到底高斯的设计到底是怎么做的。
    cnhongwei
        11
    cnhongwei  
       1 月 14 日
    这是把''当 null 处理,所有与 null 运行的结果都是 null 。oralce 就是这样的,gaussdb 没有用过,我想他是为了和 oracle 完全兼容。oracle 是把''做 null 处理,也做为 null 存储。
    timesh
        12
    timesh  
       1 月 14 日
    你就升吧,等哪天为了漏洞再升版本,发现改了特性,就好玩了。
    sivl6p
        13
    sivl6p  
       1 月 14 日
    信创没前途,抓紧时间跑路吧
    MIUIOS
        14
    MIUIOS  
       1 月 14 日   ❤️ 2
    接触信创的东西会让你不幸,要么文档一坨要么创意魔改。
    knktc
        15
    knktc  
       1 月 14 日
    你们用的是 A 兼容模式的话就是指 Oracle 兼容模式,行为和 Oracle 是一样的
    yjhatfdu2
        16
    yjhatfdu2  
       1 月 14 日
    你的 pg 可能也是信创的,result_1 反正我的 pg 是 1 ,而且怎么看也应该是 1
    yeqizhang
        17
    yeqizhang  
       1 月 14 日 via Android
    @imaple null or null 有啥不能解释的
    sunnysab
        18
    sunnysab  
       1 月 14 日
    可以在设置中修改数据库的这个行为吗?
    Danswerme
        19
    Danswerme  
       1 月 14 日 via iPhone
    @yjhatfdu2 楼主 db 在内网,手敲的结果,敲错啦
    0x663
        20
    0x663  
       1 月 14 日   ❤️ 1
    关闭 gaussdb 的 oracle 兼容模式就可以了。
    wangYQ
        21
    wangYQ  
       1 月 14 日
    信创的数据库还是尽量选兼容 PG 的或者说 从 PG 套皮或者改过来的,起码语法问题能解决。有的缝合怪真的性能还不行,语法还得重新兼容
    issakchill
        22
    issakchill  
       1 月 14 日
    之前我们也是要 mysql 转 gaussdb 大概方案已经做好了 当时在 mybatis 的 xml 里面全部加上 mysql 跟 gaussdb 的方言。。。那工作量做得想死
    后来甲方良心发现 转成 polardbx 基本无缝切换
    visper
        23
    visper  
       1 月 14 日   ❤️ 1
    以前好像试过这个数据库。反正当他是遇到有 null 值啊 null 字段之类的就一定要用 is null,不能等于匹配,否则肯定查不出来之类的。看这上面好像规则就像把''当成 null,然后一等号匹配就直接返回 null.
    yeqizhang
        24
    yeqizhang  
       1 月 14 日 via Android
    @visper null 在很多数据库都是特殊的不能用等于号
    xiaomushen
        25
    xiaomushen  
       1 月 14 日
    信创 db 很多语法,都是为了迁就 oracle
    PopRain
        26
    PopRain  
       1 月 14 日
    感觉楼主还是见的太少,ORACLE 应该就是这样的,接触过一次很不习惯,反人类
    Elietio
        27
    Elietio  
       1 月 14 日 via Android
    我们俩数据库,一个 Oracle 兼容模式,一个 MySQL 兼容模式,那酸爽
    kkwa56188
        28
    kkwa56188  
       1 月 14 日
    O 系的, 第一眼看就感觉是 is null 的问题.
    这种小知识点, 懂了一次以后就终身懂了, 以后的问题,就留给后人吧
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2659 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:05 · PVG 19:05 · LAX 03:05 · JFK 06:05
    ♥ Do have faith in what you're doing.