查看原文
其他

IvorySQL在「兼容oracle」方面做了哪些工作?

DutMsn IvorySQL开源数据库社区
2024-09-30



预计阅读时间

12分钟

导 读


PostgreSQL是世界最先进的开源关系型数据库,依托 20 多年的社区发展,造就了其高水平的故障恢复能力、完整性和正确性。

IvorySQL是一款兼容Oracle并以PostgreSQL为基础开发的开源数据库自瀚高股份正式发布IvorySQL并成立IvorySQL开源社区以来,便受到大家广泛关注,这是我们的荣幸,同时也是我们追求卓越,不断突破的动力!


如果您正在使用IvorySQL进行开发,并且想要了解IvorySQL在兼容oracle方面做了哪些工作,以下内容将对您有所帮助。

01


初始化


IvorySQL基于PostgreSQL,它支持PostgreSQL的所有数据类型以及内置函数。IvorySQL的初始化方式非常灵活,可以根据需求选择运行在纯PostgreSQL模式或者Oracle兼容模式,这样的设计可以让用户更方便地进行迁移或是新项目的开发

如果初始化IvorySQL数据库实例的时候选择指定-m pg参数那么IvorySQL将会以一个纯净的PostgreSQL版本(即不会装载ivorysql_ora和plisql扩展)运行。

如果选择指定-m oracle或者不指定,该数据库将会以Oracle兼容模式运行。

当IvorySQL运行在纯净的PostgreSQL版本时,我们新增的用于控制数据库行为的一些GUC参数将不能被查看或者修改。即使在兼容版本的情况下,如果你希望使用IvorySQL的兼容功能,仍然可以通过设置set ivorysql.compatilbe_mode to pg来获得使用纯净的PostgreSQL数据库的体验。


02


版本说明


我们计划在不久将要发布基于PostgreSQL16的IvorySQL3.0,采用双端口和双解析器(parser) 来实现与Oracle的兼容性截止到目前,基于master分支编译的数据库版本为16beta1。

注:IvorySQL社区版本会紧跟PostgreSQL最新版本内核,通常会在PostgreSQL发布稳定版一个月内进行发布IvorySQL正式版本。关于beta版的更新,将取决于我们的社区开发人员的工作计划。


03


数据类型


除了PostgreSQL的数据类型以外,IvorySQL为了兼容Oracle所支持的数据类型,包含以下几种:

  • char
  • varchar
  • varchar2
  • number
  • binary_float
  • binary_double
  • date
  • timestamp
  • timestamp with time zone
  • timestamp with local time zone
  • interval year to month
  • interval day to second
  • raw
  • long

这些兼容数据类型与PostgreSQL的数据类型对应关系如下:

PostgreSQL数据类型

兼容数据类型

real/float4

binary_float

double precision/float8

binary_double

date

date

time

date

timestamp

timestamp

boolean

number(1)

smallint

number(5)

integer

number(10)

bigint

number(19)

character(n)

char(n)

character varying(n)

varchar2(n)

...

...


在这里不再列出所有对应的数据类型,未来的IvorySQL也会在兼容Oracle方面支持更多的数据类型,敬请期待。

💁‍♂️请访问IvorySQL文档中心查看IvorySQL所支持的所有数据类型。🔗https://docs.ivorysql.org/

值得一提的是,IvorySQL社区近期的改动可能会让用户在使用兼容的数据类型时更加人性化。

在兼容模式下,如果使用了PG的数据类型,例如:
postgres=# create table test(a pg_catalog.varchar);
CREATE TABLE
postgres=# \d test
                     Table "public.test"
 Column |        Type        | Collation | Nullable | Default 
--------+--------------------+-----------+----------+---------
 a      | pg_catalog.varchar |           |          | 


之后,切换回PostgreSQL模式下
postgres=# set ivorysql.compatible_mode to pg;
SET
postgres=# \d test
                     Table "public.test"
 Column |       Type        | Collation | Nullable | Default 
--------+-------------------+-----------+----------+---------
 a      | character varying |           |          | 

同理,在PostgreSQL模式下,使用兼容的数据类型,也会如上。(这不会影响pg_dump的功能...maybe,欢迎大家的反馈🤗)


04


内置函数


IvorySQL目前兼容的内置函数部分如下:

  • sysdate
  • systimestamp
  • add_months
  • last_day
  • next_day
  • months_between
  • current_date
  • current_timestamp
  • new_time
  • tz_offset
  • trunc
  • instrb
  • substr
  • substrb
  • trim
  • ltrim
  • rtrim
  • length
  • lengthb
  • rawtohex
  • replace
  • regexp_replace
  • regexp_substr
  • regexp_instr
  • regexp_like
  • to_number
  • to_char
  • to_date
  • to_timestamp
  • to_timestamp_tz
  • to_yminterval
  • to_dsinterval
  • numtodsinterval
  • numtoyminterval
  • localtimestamp
  • from_tz
  • sys_extract_utc
  • sessiontimezone
  • hextoraw
  • uid
  • USERENV

下面对一小部分函数进行说明,更详细的说明可以参考我们的🔗IvorySQL文档中https://docs.ivorysql.org/


4.1 兼容sysdate函数


功能:查看对应的日期与时间,测试用例如下:
postgres=# select sysdate() from dual;
  sysdate   
------------
 2023-09-08
(1 row)

查询往前推一天的日期:
postgres=# select sysdate() -1 from dual;
  ?column?  
------------
 2023-09-07
(1 row)


4.2 兼容instrb函数


功能:字符串查找函数,返回字符串的位置,支持参数:varchar2, text, number DEFAULT 1, number DEFAULT 1,以下为测试用例:

返回CORPORATE FLOOR中默认第一次出现OR时字符串的位置:
postgres=# SELECT INSTRB('CORPORATE FLOOR','OR') "Instring in bytes" FROM DUAL;
 Instring in bytes 
-------------------
                 2
(1 row)

返回corporate floor中从第五个字符开始查询,第二次出现or时字符串的位置:
postgres=# SELECT INSTRB('CORPORATE FLOOR','OR',5,2) "Instring in bytes" FROM DUAL;
 Instring in bytes 
-------------------
                14
(1 row)


4.3 兼容substr函数


功能:截取字符串函数,以字符为单位截取,支持参数:text, integer, 测试用例如下:截取'  今天天气很好'中从第五个字符开始,往后的字符串:
postgres=# SELECT SUBSTR('今天天气很好',5) "Substring with bytes" FROM DUAL;
 Substring with bytes 
----------------------
 很好
(1 row)


4.4 兼容ltrim函数


功能:去除指定字符串的左侧空格或对应数据,支持参数:varchar2 /varchar2,varchar2,测试用例如下:去除'   abcdefg   '的左侧空格:
postgres=# select ltrim('   abcdefg   ')ltrim from dual;
   ltrim    
------------
 abcdefg   
(1 row)

从'abcdefg'左侧开始遍历,一旦存在某字符出现在'fegab'中就去除,不存在则返回结果:
postgres=# select ltrim('abcdefg','fegab')ltrim from dual;
 ltrim 
-------
 cdefg
(1 row)


4.5 兼容rtrim函数


功能:去除指定字符串的右侧空格,测试用例如下:去除'   abcdefg   '的右侧空格:
postgres=# select rtrim('   abcdefg   ')rtrim from dual;
   rtrim    
------------
    abcdefg
(1 row)

从'abcdefg'右侧开始遍历,一旦存在某字符出现在'fegab'中就去除,不存在则返回结果:
postgres=# select rtrim('abcdefg','fegab')rtrim from dual;
 rtrim 
-------
 abcd
(1 row)


4.6 兼容to_number函数


功能:是将一些处理过的按一定格式编排过的字符串变回数值型的格式,支持参数:text/text,text测试用例如下:将字符串'-34,338,492'转换为数值型格式:
postgres=# SELECT to_number('-34,338,492', '99,999,999') from dual;
 to_number 
-----------
 -34338492
(1 row)

将字符串'5.01-'转换为数值型格式:
postgres=# SELECT to_number('5.01-', '9.99S');
 to_number 
-----------
 -5.01
(1 row)


4.7 兼容uid函数


功能:获取数据库的实例名。测试用例如下:获取当前数据库的实例名:
postgres=# select uid() from dual;
 uid 
-----
  10
(1 row)

以上为部分兼容函数的测试结果,更详细的可以参考🔗IvorySQL文档中心:
https://docs.ivorysql.org/


05


总结


本日志描述了IvorySQL数据库的核心功能和特点,从初始化和版本更新,以及数据类型和内置函数,阐述了IvorySQL如何实现与Oracle数据库的兼容性。希望此日志能帮助到读者,如果有任何疑问,请联系🔗IvorySQL社区:https://www.ivorysql.org



·END·


「IvorySQL外部贡献者活动」正在如火如荼地进行中!🏄‍♂️

为IvorySQL代码做贡献,赢取千元奖金!



IvorySQL


一款基于PostgreSQL并兼容Oracle的开源数据库

官方网址
https://www.ivorysql.org/zh-cn/
社区仓库
https://github.com/IvorySQL/IvorySQL
IvorySQL社区欢迎并赞赏所有类型的贡献,期待您的加入!
记得在GitHub给我们一个 ⭐奥~

🐘点击蓝字 跳转 GitHub

继续滑动看下一个
IvorySQL开源数据库社区
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存