空字符串到底是不是 NULL? IvorySQL 兼容性实测

「文智助手」全场景办公AI助理AI+OPC全流程实践方案(大赛作品) 阅读详情

本文作者:柒柒天晴。现居乌鲁木齐,数据库从业者,专注 Oracle、PostgreSQL,持 Oracle 中级系列认证。

Oracle 和 PostgreSQL 对空字符串处理逻辑完全相反。

  • Oracle:空字符串''等价于NULL;'' IS NULL为真,length('')返回NULL,向varchar2写入''实际存储为NULL,NOT-NULL 列插入''触发约束报错。
  • PostgreSQL:空字符串是独立有效值;'' IS NULL为假,length('')返回 0,空串与NULL互不等同。

Oracle 业务迁移到 PG 生态时,依赖"空串等于 NULL"的判断、过滤、拼接逻辑会出现行为异常。

IvorySQL 通过会话 GUC 开关 ivorysql.enable_emptystring_to_NULL 实现 Oracle 兼容:当ivorysql.compatible_mode = oracle且该开关开启,词法层将空串字面量解析为 NULL,参数绑定层将零长度输入参数置为 NULL,在入口模拟 Oracle 语义;pg 模式不会执行转换。该开关编译期默认值为false,本实例经数据目录ivorysql.conf显式置为on(见文末源码定位)。

相关配置文档较为分散,本文基于 IvorySQL_5.4 源码编译环境完成完整实测,正文聚焦兼容性验证,编译安装步骤从略,仅在文末附编译安装的 2 个典型报错及处理(#附编译安装的典型报错)。

环境与软件说明

项目值
操作系统Rocky Linux 9.5
数据库版本PostgreSQL 18.4 (IvorySQL 5.4)
安装目录/opt/ivorysql/5.4
监听端口5432(PG 协议)、1521(Oracle 兼容协议),同一进程监听双端口

测试计划:配置 NULL 显示标记,查看 3 项核心 GUC;分别在 pg/oracle 两种兼容模式执行插入,验证IS NULL、length()、等值判断;覆盖默认值、NOT-NULL 约束、UPDATE、函数、表达式;验证开关关闭行为、存量旧表行为。

空串转 NULL 验证

-- 设置NULL显示标识
\pset null '(NULL)'

-- 查看核心兼容参数
SELECT name, setting, context
FROM pg_settings
WHERE name IN ('ivorysql.database_mode', 'ivorysql.compatible_mode',
               'ivorysql.enable_emptystring_to_NULL')
ORDER BY name;

                name                 | setting | context
-------------------------------------+---------+----------
 ivorysql.compatible_mode            | pg      | user
 ivorysql.database_mode              | oracle  | internal
 ivorysql.enable_emptystring_to_NULL | on      | user
(3 rows)

初始状态:

  • ivorysql.database_mode=oracle(实例内部固定不可修改)
  • ivorysql.compatible_mode=pg
  • ivorysql.enable_emptystring_to_NULL=on

后两项为会话可修改参数。

PG 兼容模式

CREATE TABLE t_empty (id int, v varchar(20));
INSERT INTO t_empty VALUES (1, '');
INSERT INTO t_empty VALUES (2, 'x');
SELECT id, v, v IS NULL AS is_null, length(v) AS len, v = '' AS eq_empty FROM t_empty ORDER BY id;

 id | v | is_null | len | eq_empty
----+---+---------+-----+----------
  1 |   | f       |   0 | t
  2 | x | f       |   1 | f
(2 rows)

现象:插入空串后,is_null=false、len=0、v=''条件成立,行为和原生 PostgreSQL 保持一致。

Oracle 兼容模式(开关 on)

SET ivorysql.compatible_mode = oracle;
TRUNCATE t_empty;
INSERT INTO t_empty VALUES (1, '');
INSERT INTO t_empty VALUES (2, 'x');
SELECT id, v, v IS NULL AS is_null, length(v) AS len, v = '' AS eq_empty FROM t_empty ORDER BY id;

 id |   v    | is_null |  len   | eq_empty
----+--------+---------+--------+----------
  1 | (NULL) | t       | (NULL) | (NULL)
  2 | x      | f       |      1 | (NULL)
(2 rows)

-- 字面量空串测试
SELECT '' IS NULL AS literal_is_null;

 literal_is_null
-----------------
 t
(1 row)

-- 预处理绑定参数测试
PREPARE p_empty(text) AS SELECT $1 IS NULL AS is_null, length($1) AS len;
EXECUTE p_empty('');

 is_null |  len
---------+--------
 t       | (NULL)
(1 row)

现象:

  1. 插入''落库变为NULL;is_null=true,length(v)返回(NULL),v=''比较结果返回未知(NULL);
  2. 字面量'' IS NULL结果为 true;
  3. 绑定传入空字符串,同样被转换为NULL。

转换发生在 SQL 解析与参数绑定阶段,不是存储层改写。

默认值 & NOT-NULL 约束

-- 默认值为空串
CREATE TABLE t_default2 (id int, v varchar2(20) DEFAULT '');
INSERT INTO t_default2 (id) VALUES (1);
SELECT * FROM t_default2;

 id |   v
----+--------
  1 | (NULL)
(1 row)

-- NOT-NULL约束测试
CREATE TABLE t_nn (id int, v varchar2(20) NOT NULL);
INSERT INTO t_nn VALUES (2, ''); -- 插入空字符串

ERROR:  null value in column "v" of relation "t_nn" violates not-null constraint
DETAIL:  Failing row contains (2, null).

现象:

  1. DEFAULT '',默认值空串被转换为NULL存入;
  2. NOT-NULL 列显式插入'',内部转为NULL,直接违反非空约束报错。

UPDATE 更新空串

UPDATE t_empty SET v = '' WHERE id = 2;
SELECT id, v, v IS NULL AS is_null FROM t_empty ORDER BY id;

 id |   v    | is_null
----+--------+---------
  1 | (NULL) | t
  2 | (NULL) | t
(2 rows)

现象:UPDATE 语句中赋值''同样被转成NULL。

函数与表达式(oracle 模式)

-- 数值/日期/时间戳类型写入空串
CREATE TABLE t_mix (id int, n numeric, d date, t timestamp);
INSERT INTO t_mix VALUES (1, '', '', '');
SELECT id, n IS NULL AS n_null, d IS NULL AS d_null, t IS NULL AS t_null FROM t_mix;

 id | n_null | d_null | t_null
----+--------+--------+--------
  1 | t      | t      | t
(1 row)

-- 算术表达式
SELECT 1 + '' AS a, 1 - '' AS b, 1 * '' AS c, 1 / '' AS d, 1 % '' AS e;

   a    |   b    |   c    |   d    |   e
--------+--------+--------+--------+--------
 (NULL) | (NULL) | (NULL) | (NULL) | (NULL)
(1 row)

-- 函数与拼接
SELECT length('') AS len_from_dual FROM dual;

 len_from_dual
---------------
        (NULL)
(1 row)

SELECT id, COALESCE(v, '(default)') AS coalesce_v, v || '|x' AS concat_v
FROM t_empty ORDER BY id;

 id | coalesce_v | concat_v
----+------------+----------
  1 | (default)  | |x
  2 | (default)  | |x
(2 rows)

-- 拼接行为对比:同一行、列值同为 NULL 时,两种模式给出相反结果
-- pg 模式
SET ivorysql.compatible_mode = pg;
CREATE TABLE t_cmp (id int, v varchar(20));
INSERT INTO t_cmp VALUES (1, 'x');
UPDATE t_cmp SET v = NULL WHERE id = 1;
SELECT id, v IS NULL AS is_null, v || '|x' AS concat_v FROM t_cmp;

 id | is_null | concat_v
----+---------+----------
  1 | t       | (NULL)
(1 row)

-- oracle 模式,同一张表、同一行、同一个 NULL 值
SET ivorysql.compatible_mode = oracle;
SELECT id, v IS NULL AS is_null, v || '|x' AS concat_v FROM t_cmp;

 id | is_null | concat_v
----+---------+----------
  1 | t       | |x
(1 row)

-- NULL 常量在两种模式下同样相反
SET ivorysql.compatible_mode = oracle;
SELECT NULL || '|x' AS null_lit_concat;

 null_lit_concat
-----------------
 |x
(1 row)

SET ivorysql.compatible_mode = pg;
SELECT NULL || '|x' AS null_lit_concat;

 null_lit_concat
-----------------
 (NULL)
(1 row)

-- 回到 oracle 模式,继续后续测试
SET ivorysql.compatible_mode = oracle;
DROP TABLE t_cmp;

-- 过滤计数
SELECT count(*) AS eq_empty FROM t_empty WHERE v = '';

 eq_empty
----------
        0
(1 row)

SELECT count(*) AS is_null FROM t_empty WHERE v IS NULL;

 is_null
---------
       2
(1 row)

现象:类型转换、算术、length() 都按 NULL 传播;字符串拼接是例外——|| 按 Oracle 语义把 NULL 当空串。v 此时已是 NULL(coalesce_v 两行都落到 (default) 可证),v || '|x' 仍得到 |x;把同一行 NULL 值放到 pg 模式下再拼,结果是 (NULL),NULL 常量在两种模式下同样一得 |x 一得 (NULL)。WHERE v = '' 过滤结果为 0 行——业务里这类条件要改成 IS NULL,这正是迁移时最容易踩的差异点。

关闭空串转 NULL 开关(oracle 模式)

SET ivorysql.enable_emptystring_to_NULL = off;
TRUNCATE t_empty;
INSERT INTO t_empty VALUES (1, '');
INSERT INTO t_empty VALUES (2, 'x');
SELECT id, v, v IS NULL AS is_null, length(v) AS len, v = '' AS eq_empty FROM t_empty ORDER BY id;

 id | v | is_null | len | eq_empty
----+---+---------+-----+----------
  1 |   | f       |   0 | t
  2 | x | f       |   1 | f
(2 rows)

现象:关闭开关后,即使处于 oracle 兼容模式,空串不再转换,恢复 PG 原生行为。

切回 pg 模式,开关保持 on

SET ivorysql.enable_emptystring_to_NULL = on;
SET ivorysql.compatible_mode = pg;
TRUNCATE t_empty;
INSERT INTO t_empty VALUES (1, '');
INSERT INTO t_empty VALUES (2, 'x');
SELECT id, v, v IS NULL AS is_null, length(v) AS len, v = '' AS eq_empty FROM t_empty ORDER BY id;

 id | v | is_null | len | eq_empty
----+---+---------+-----+----------
  1 |   | f       |   0 | t
  2 | x | f       |   1 | f
(2 rows)

现象:pg 模式下,即便开关为 on,不会触发空串转 NULL。

转换逻辑需要同时满足:compatible_mode=oracle + enable_emptystring_to_NULL=on。

存量旧表测试(重点)

-- pg模式建表,写入真实空字符串
SET ivorysql.compatible_mode = pg;
CREATE TABLE t_legacy (id int, v varchar(20));
INSERT INTO t_legacy VALUES (1, '');

-- 切换到oracle模式,查询存量数据
SET ivorysql.compatible_mode = oracle;
SELECT id, v, v IS NULL AS is_null, length(v) AS len, v = '' AS eq_empty FROM t_legacy;

 id | v | is_null | len | eq_empty
----+---+---------+-----+----------
  1 |   | f       |   0 | (NULL)
(1 row)

现象:已经落库的存量空串不会被改写。切换 oracle 模式后,数据存储不变:is_null=false,length=0;仅表达式v=''返回(NULL)——这也说明 oracle 模式下WHERE v=''连真实空串也匹配不到,识别存量真实空串要在 pg 模式或关闭开关后执行,length(v)=0 则在两种模式下都成立。

补充语法点:varchar2类型仅在compatible_mode=oracle会话中可创建,pg 模式执行建表会报类型不存在。

功能开关源码定位

查 GUC 定义、词法解析器和参数绑定三处代码,确认默认值和两个转换入口。

[root@node1 ~]# grep -n 'enable_emptystring_to_NULL' /tmp/IvorySQL-IvorySQL_5.4/src/backend/utils/misc/ivy_guc.c
41:bool		enable_emptystring_to_NULL = false;
139:		{"ivorysql.enable_emptystring_to_NULL", PGC_USERSET, COMPAT_ORACLE_OPTIONS,
143:		&enable_emptystring_to_NULL,
[root@node1 ~]# grep -n 'ivorysql.enable_emptystring_to_NULL' /opt/ivorysql/5.4/data/ivorysql.conf
13:ivorysql.enable_emptystring_to_NULL = 'on'
  1. GUC 参数定义(ivy_guc.c):代码内部变量默认值是 false(第 41 行),GUC 注册在第 139-143 行,分类 PGC_USERSET、分组 COMPAT_ORACLE_OPTIONS,会话可修改。实例实际为 on,来自数据目录 ivorysql.conf 第 13 行的显式配置。
[root@node1 ~]# grep -n -B 4 -A 6 'enable_emptystring_to_NULL' /tmp/IvorySQL-IvorySQL_5.4/src/backend/oracle_parser/ora_scan.l
654-											   false);
655-							yylval->str = litbufdup(yyscanner);
656-							if (strcmp(yylval->str, "") == 0 &&
657-								ORA_PARSER == compatible_db &&
658:								enable_emptystring_to_NULL)
659-							{
660-								return NULL_P;
661-							}
662-							return SCONST;
663-						case xus:
664-							yylval->str = litbufdup(yyscanner);
  1. 字面量转换入口(ora_scan.l):解析器为 ORA_PARSER 且开关开启时,空串字面量直接返回 NULL_P(第 656-661 行),不再返回字符串常量 SCONST。
[root@node1 ~]# grep -n -B 3 -A 8 'enable_emptystring_to_NULL' /tmp/IvorySQL-IvorySQL_5.4/src/backend/tcop/postgres.c
1992-				 * call.
1993-				 */
1994-				if (compatible_db == ORA_PARSER &&
1995:					enable_emptystring_to_NULL &&
1996-					plength == 0)
1997-				{
1998-					pbuf.data = NULL;		/* keep compiler quiet */
1999-					csave = 0;
2000-					isNull = true;
2001-					plength = -1;
2002-				}
2003-				else
  1. 绑定参数转换入口(postgres.c):绑定参数长度为 0 时置 isNull = true(第 1994-2002 行),对应 psql 会话里 EXECUTE p_empty('') 被转成 NULL 的结果。

迁移要核对的点

  1. 参数策略:ivorysql.compatible_mode会话级切换 pg/oracle;空串转 NULL 需要两项条件同时生效。业务依赖 Oracle"空串即 NULL"则保持开关 on,不需要该兼容可以关闭。
  2. DDL 结构核对:
    • NOT-NULL 列:oracle 模式下插入''等价插入 NULL,如果源库业务允许存空串,迁移脚本需要特殊处理;
    • DEFAULT '':默认值会转为 NULL,确认业务是否符合预期;
    • varchar2只能在 oracle 兼容会话创建。
  3. 存量数据:切换兼容模式不会修改已存储数据;识别存量真实空串要在 pg 模式(或关闭开关)下用WHERE v = '',oracle 模式下该条件不匹配任何行,也可改用两种模式都成立的WHERE length(v) = 0。
  4. SQL 业务逻辑改造:
    • Oracle 中''本身就是 NULL,WHERE col = '' 实为 col = NULL,跟 NULL 比结果未知,一行都取不到;IvorySQL oracle 模式col=''同样查不到数据,要查空值得写 col IS NULL;
    • 空串从 SQL 字面量或 JDBC/PLSQL 绑定参数进来,length()、COALESCE 都按 NULL 传播;字符串拼接|| 按 Oracle 语义将 NULL 当空串处理(NULL || 'x' 得到 x,原生 PostgreSQL 下返回 NULL),两端行为相反,需要重新校验业务 SQL。
  5. 端口说明:5432、1521 双端口监听是 IvorySQL 正常设计,1521 为 Oracle 兼容端口,按需放行防火墙。

附:编译安装的典型报错

最小化 Rocky Linux 9.5 从源码编译 IvorySQL 5.4,最容易卡住的是这两个报错,修复后续跑 make 即可;改过 configure 参数的先 make distclean。

1. configure 失败:没有 C 编译器,装基础编译依赖后重跑:

configure: error: no acceptable C compiler found in $PATH
# dnf install -y gcc make readline-devel zlib-devel flex bison perl-devel perl-ExtUtils-Embed

2. uuid-ossp 编译中断:必须显式指定 UUID 库,报错只提示加 --with-uuid 开关,不说明选哪个库;装 libuuid-devel 后重新 configure:

uuid-ossp.c:40:2: 错误:#error "please use configure's --with-uuid switch to select a UUID library"
# dnf install -y libuuid-devel
# make distclean
# ./configure --prefix=/opt/ivorysql/5.4 --without-llvm --without-icu --with-uuid=e2fs
船载 OpenHarmony AIS 航海工作台:告警与防碰撞预警系统 船载OpenHarmony AIS航海工作台的告警与防碰撞系统,集成十余类告警(超速、偏航、会遇、SOS等),通过网格空间索引实现高效邻近判定,保障实时性。告警管理器统一调度规则、去重、通知与日志,支持悬浮球、语音、跑马灯、弹窗多渠道触达,确保航行安全。SOS紧急通道独立运行,避免干扰。系统设计强调性能优化与多场景适配,为航海安全提供核心支撑。 阅读详情

相关推荐

华为2288H-V5服务器做raid的详细步骤

操作步骤 服务器启动界面 按del键进入设置输入密码,2288H-v5默认密码是Admin@9000 移动光标选择device manager 驱动管理选择configurationutility 配置管理 选择main menu 主菜单 选择第一个 configuration management 配置管理 选择create virtual driver 创建虚拟驱动选择select RAID level 选择RAID等级选择level-5 选择select drivers 选择驱......

weixin_46041124的博客 1万+

Oracle 迁到 IvorySQL,到底能少改多少代码?我实测了一遍

本文作者:施嘉伟,12 年数据库从业经验,Oracle ACE Pro、PostgreSQL ACE,OCM/PGCM/KCM 认证。IvorySQL 专家顾问委员、KVA、崖山 YVP、KWDB MVP、PolarDB 开源社区/HaloDB 技术顾问、TiDB 社区技术布道师、青学会 MOP 技术社区专家顾问。去 O 的项目一旦进入实施阶段,团队问的问题就变得很具体:原来的 SQL 还能不能跑?PL/SQL 要改多少?客户端要不要换?事务语义会不会变?

IvorySQL的博客 488

Unity游戏开发:从零开始适配Nintendo Switch的完整指南

本文详细介绍了如何使用Unity进行Nintendo Switch游戏开发的完整流程,包括开发环境搭建、Unity工程适配、手柄与硬件特性开发、存储与性能优化等关键步骤。特别强调了Switch SDK的配置、输入系统改造和内存优化技巧,帮助开发者高效完成跨平台适配。

vodka的博客 1072

IvorySQL的IVY_GUC框架介绍与使用指南

1521’端口为Oracle模式监听端口,当连接server的端口为1521时,该参数的值为‘oracle’,您可以通过‘set’命令设置其值为‘pg’。该参数表示当前数据库的兼容模式,可以通过执行‘show’命令查看,在使用‘psql’连接时,如果指定PG模式的端口,该参数的值为‘pg’;该参数的取值为‘on’或‘off’,您可以通过执行‘show’命令来查看其当前值,也可以通过‘set’命令进行修改。即使连接的是PG模式的端口,仍然可以通过‘set’命令将当前数据库的兼容模式设置为另一个模式。

IvorySQL的博客 288

保姆级教程:在Ubuntu 22.04上用Python3.10和pysoem搞定EtherCAT电机回零与位置控制

本文提供在Ubuntu 22.04上使用Python3.10和pysoem实现EtherCAT电机回零与位置控制的详细指南。涵盖环境搭建、权限配置、EtherCAT主站架构解析、CiA402协议核心机制及工业级精度控制实现,帮助开发者快速掌握Python在工业自动化中的应用。

weixin_30952535的博客 330

西门子smart能搜到cpu但连接当前IP地址失败

将ip地址改到同一网段 本机为192.168.1.119就是192.168.1.1网段,但plc在192.168.0.1网段,所以显示ip连接失败,改为同一网段192.168.1.xxx即可(为避免ip冲突尽量改到200往后最大255)如果显示这一步,那么你的物理连接是没有问题的,应当是plc和电脑并不在同一网段导致的问题。输入ipconfig 查看本机网段与plc是否为同一网段。此电脑就不在同一网段所有造成通讯失败,接下来解决这个问题。win+r打开运行,打开cmd。再次尝试,如果还是报错,那么。

weixin_62678581的博客 9870

IvorySQL 5.0+:助力 Oracle 平滑过渡至 PostgreSQL 的里程碑式产品

作者:Yasir Hussain Shah,Data Bene 团队。:一种“先进、功能完备、开源且兼容 Oracle 的 PostgreSQL 数据库,始终致力于保持 100% 兼容性,并可作为最新 PostgreSQL 的无缝替代”。同时,这款引擎也是我们团队将各类外部 SQL 语句及应用适配至 PostgreSQL 时的首选工具!我们秉持平滑过渡、而非整体迁移的理念 —— 让旧数据库引擎向新引擎逐步切换,核心为降低迁移风险、优化实施效果。借助这类方案,能为实现这两大目标带来关键助力。

IvorySQL的博客 693

dToF直方图之美

上面视频里如果你能看懂,那么就能理解对于dToF单点的测距问题,对于大部分的描述在AMS和ST里的手册都非常的详细,有疑问的可以后台来找我探讨,今天我们单纯从上层讨论成像的问题。作为dToF算法工程师,应该是对直方图敏感的,直方图的每个Count峰都会表征出问题,因为dToF的输出只有直方图,观察直方图能够逆推出dToF的很多东西,这也是大多数公司不愿意开放直方图和Raw data的缘故。以上是一个小面阵的分辨率,第一张是直方图,后面是基于直方图寻峰出来的成像ToF图,Peak图,以及噪声Noise图。

dream it possible 2995

IvorySQL 5.0 发布:基于 PG 18.0,Oracle 兼容、生态组件、云原生与易用性全面进化!

IvorySQL 开源社区小伙伴们,大家好,IvorySQL 开源社区今天激动的向大家宣布:IvorySQL 5.0 发布了!IvorySQL 5.0 基于 PostgreSQL 18.0 全面升级:Oracle 兼容性再突破,生态组件集成再升级,云原生深度支持,配合全平台安装包与在线丝滑体验,让复杂变得简单。

IvorySQL的博客 537

【STM32F042】使用NTC热敏电阻实现温度测量

1.NTC介绍 NTC是负温度系数的简写,全称是Negative temperature coefficient.意思是随着温度的升高,电阻值呈现下降趋势。常用作温度传感器。这里有一个式子表示负温度系数的电阻值: RT=R0*exp(B (1/T-1/T0)) RT为周围温度为T (K) 时的电阻值,R0是周围温度为T0(K) 时的电阻值,注意这里的温度是开...

BadBoyHolly的博客 3万+

在鸿蒙中使用AVPlayer完成视频的播放【坚果派】

播放的全流程包含:创建AVPlayer,设置播放资源和窗口,设置播放参数(音量/倍速/缩放模式),播放控制(播放/暂停/跳转/停止),重置,销毁资源。5.准备播放:调用prepare(),AVPlayer进入prepared状态,此时可以获取duration,设置缩放模式、音量等。8.退出播放:调用release()销毁实例,AVPlayer进入released状态,退出播放。6.视频播控:播放play(),暂停pause(),跳转seek(),停止stop() 等操作。今天我们来看一下视频如何正常播放。

坚果的博客 4057

IvorySQL 5.3基于PG 18.3内核,升级兼容性与运维体验

数据库内核是存储引擎、事务管理、查询优化器等底层机制的总和,直接决定SQL执行效率与系统稳定性。PostgreSQL 18.3内核在并行查询、I/O路径、资源管理和安全加密上均有显著增强,为高并发交易与分析型负载提供了更扎实的底座。IvorySQL 5.3正是基于这一内核构建,并强化了Oracle兼容层、分区表管理和运维诊断能力,配合pg_upgrade工具可平滑完成从旧版本或PG生态的迁移。无论是新建应用、存量系统改造,还是容器化部署,该版本都提供了一个更稳、更易用的数据库选型方案。

weixin_32325225的博客 294

联邦学习中的差分隐私保护详解及python实现

随着数据隐私法规(如 GDPR、CCPA)日益严格,传统将数据集中到云端训练模型的方式面临合规与安全风险。联邦学习通过让各客户端保留本地数据,仅共享模型更新,缓解了数据流动带来的隐私风险。但模型更新仍可能泄露个体信息。为进一步保障隐私,可在本地更新中引入差分隐私(DP)机制,通过向梯度或模型更新中注入随机噪声,防止反向推断原始数据citeturn0search9。

闲人编程的博客 1923

IvorySQL 5.3正式发布:基于PG 18.3内核的Oracle兼容与原生PG双轨实践

在开源数据库生态中,PostgreSQL一直是企业级应用的可靠基础,而如何将Oracle存量业务平滑迁移到开放架构,是许多技术团队长期关注的痛点。IvorySQL 5.3的正式发布,给出了一个值得研究的答案:它紧跟PG 18.3内核,通过深度兼容Oracle语义与原生PostgreSQL能力共生的双轨设计,让同一实例既能运行传统Oracle风格的包、层次查询和数据类型,又能调用PG原生的扩展与并行计算能力。从高并发大事务处理到复杂存储过程改写,这一版本在实际迁移场景中显著降低了SQL改写成本,也为数据库国产

weixin_32612263的博客 245

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Oracle 为什么能跑在 PostgreSQL 上?答案藏在这套内核里

IvorySQL 对 PG 生态的贡献,在于给 PostgreSQL 生态加上了一条面向 Oracle 存量系统迁移的内核级路径。企业系统里,Oracle 往往不是一个单纯的数据存储。大量业务逻辑、权限习惯、报表工具、运维脚本、数据字典查询、存储过程和包都围绕 Oracle 建了很多年。IvorySQL 把 parser、类型、Package、PL/iSQL、系统视图、内置函数、会话语义这些迁移难点放到数据库侧处理,本质上是在降低企业拥抱 PG 生态的门槛。

IvorySQL的博客 348

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

PostgreSQL笔记4: 市场地位、生态全景与行业应用实践

技术能力实现方式适用场景全文检索tsvectortsquery+ GIN 索引内容搜索、日志分析半结构化数据JSONB类型 + GIN 索引灵活 Schema、配置存储向量检索pgvector扩展 + IVFFlat/HNSW 索引RAG、推荐系统、语义搜索混合查询上述能力的 SQL 组合复杂业务场景的统一数据访问表结构创建(若已存在则跳过)插入三条测试数据(包含 JSONB 和向量字段)全文检索查询(tsvectortsqueryJSONB 包含查询(@>运算符)

Wang的专栏 524

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 378

AI 问数真的能替代 BI 报表吗?

AI问数赋能自然语言查询,提升临时分析效率,但无法替代传统报表。报表适用于稳定输出与持续监控,AI则擅长探索性提问。企业用好AI问数,关键在于夯实数据模型、统一指标口径、健全权限体系与结果校验机制。合理组合报表、仪表板与AI,才能实现高效、准确的业务洞察。

葡萄城技术团队博客 298

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 263

ChatGPT、Perplexity、Gemini 与 AI Overviews 引用对比:谁的引用更可信

AI 引擎的引用机制差异很大:ChatGPT 以行内引用加 Sources 列表呈现来源,Perplexity 几乎逐句可溯源,Gemini 在回答中内嵌相关来源链接,AI Overviews 则把多源聚合答案与来源列表一起放在搜索结果顶部。本文从引用透明度、来源偏好、可干预性 3 个维度对比这 4 个引擎,并给出 GEO 的 3 点启示,帮企业在多引擎环境下提升被引用的概率。

淡然一笑 的专栏 223

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 575

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 633

抽象主义人工智能和生命体AI的内在联系

彭军辉提出“抽象主义人工智能”作为第四大AI范式,批判符号主义、连接主义、行为主义剥离生命本体的误区,确立“智能是现象,生命是本体”的核心公理。主张原生智能必须依附具备存续诉求的生命本体,提出“生命体AI理论”,构建七层演化阶梯与自闭环工程框架,强调智能不可跳过底层存续机制直接模拟语言。该体系为生成式AI提供科学边界,推动从“仿真表象”向“原生智能”的范式跃迁,开辟硅基人工生命新赛道。

抽象主义人工智能和生命体AI 177

OpenAI Control Room 架构拆解:给企业 AI Agent 加一套可审计的急停系统

OpenAI 公开了用于追踪和停止研究模型工作负载的 Control Room。本文拆解 job_id、推理前鉴权、35 秒撤销窗口与 Fail Closed 设计,并给出企业 AI Agent 急停控制面的数据模型、FastAPI 参考实现、缓存撤销策略和故障演练清单。

jerry764的博客 326

OpenClaw 深度调查:把 AI 助手做成你自己的控制平面

对 openclaw/openclaw 的完整技术尽调:Gateway 架构、Agent 运行时、工具与沙箱、30 个消息通道、181 个插件、安全信任边界、工程代价与采用建议。17 章 / 10 张图,全部数字标注口径,数据截至 2026-10-31。

厚积薄发 310

AI赋能智慧港口建设|造形家快速生成港口全要素三维场景

随着智慧港口、港口数字孪生项目的持续推进,港口三维场景的需求日益旺盛。传统港口三维建模,往往需要航拍倾斜摄影采集数据,再人工搭建吊机、岸桥、船舶、集装箱等大量工业设施模型,项目周期长、人力成本高,修改迭代繁琐,制约港口可视化项目落地效率。国产AI三维建模工具,依托卫星影像 AI 识别能力,无需航拍作业,一键快速搭建港口完整三维场景,为港口数字孪生、方案汇报、投标演示提供高效的场景解决方案。

m0_69539167的博客 65
上一篇: PostgreSQL 日报| PgBouncer 修复三个 CVE 漏洞(9 月 24 日)
下一篇: PostgreSQL 日报 |PostgreSQL 19 Beta 4 发布(9 月 25 日)
IvorySQL
博客等级 码龄5年 745粉丝 566原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值