新增GUC变量
新增GUC变量控制Oracle兼容模式下的行为。
新增变量
| 变量名 | 功能描述 |
|---|---|
| unvdb_compatible_mode | 表示当前兼容哪种数据库(pg/oracle),可以通过show命令查看,set命令更改该变量,reset命令重置为连接时的数据库模式,reset all会影响该变量 |
| unvdb_database_mode | 表示当前数据库的模式(pg/oracle),可以通过show命令查看,set/reset/reset all命令不影响该变量 |
| unvdb_oracle.datetime_ignore_nls_mask | 表示日期格式是否会受NLS参数影响,默认为0,可以通过set命令设置,reset 命令重置,reset all命令会重置该变量 |
| unvdb_oracle.enable_emptystring_to_NULL | 取值为(on/off),该变量为on时,会将插入的空字符串转成NULL值存储 |
| unvdb_oracle.identifier_case_switch | 设置字符大小写转换模式 |
| unvdb_oracle.listen_address | 表示兼容模式监听的地址,在初始化数据库时,从oracle.conf文件中读取该配置,在配置文件中修改该值,需要重启数据库生效,可以通过show命令查看 |
| unvdb_oracle.port | 表示兼容模式下连接的端口号,在初始化数据库时,从oracle.conf文件中读取该配置,在配置文件中修改该值,需要重启数据库生效,可以通过show命令查看 |
| nls_date_format | 表示默认的日期格式,可以通过show命令查看,默认为‘YYYY-MM-DD’,可以通过set命令设置,可以通过reset命令重置回默认值,reset all 命令会重置该变量 |
| nls_length_semantics | 兼容Oracle的同名参数,控制一个字符所占内存的大小 |
| nls_timestamp_format | 兼容Oracle的同名参数,控制带时间的日期格式 |
| nls_timestamp_tz_format | 兼容Oracle的同名参数,控制带时区的日期格式 |
用例
unvdb_oracle.datetime_ignore_nls_mask
该 GUC 变量的可选值为 0-15
| 可选值 | 不经过 nls 格式化的类型 |
|---|---|
| 0 | 不屏蔽任何类型,所有时间格式均由 nls 格式化 |
| 1 | date |
| 2 | timestamp |
| 3 | date、timestamp |
| 4 | timestamptz |
| 5 | date、timestamptz |
| 6 | timestamp、timestamptz |
| 7 | date、timestamp、timestamptz |
| 8 | timestampltz |
| 9 | date、timestampltz |
| 10 | timestamp、timestampltz |
| 11 | date、timestamp、timestampltz |
| 12 | timestamptz、timestampltz |
| 13 | date、timestamptz、timestampltz |
| 14 | timestamp、timestamptz、timestampltz |
| 15 | date、timestamp、timestamptz、timestampltz |
查看nls date 的格式及datetime_ignore_nls_mask值
unvdb=# set unvdb_compatible_mode to oracle;
SET
unvdb=# SET datestyle = ISO, MDY;
SET
unvdb=# show nls_date_format;
nls_date_format
-----------------
YYYY-MM-DD
(1 row)
unvdb=# show unvdb_oracle.datetime_ignore_nls_mask;
unvdb_oracle.datetime_ignore_nls_mask
-----------------------------------
0
(1 row)
创建测试表
unvdb=# create table test_nls_date(a int, created_at date);
CREATE TABLE
插入数据
unvdb=# insert into test_nls_date values(1, '2024/04/05');
INSERT 0 1
unvdb=# select * from test_nls_date;
a | created_at
---+------------
1 | 2024-04-05
(1 row)
修改nls_date_format
unvdb=# set nls_date_format to 'yy-mm-dd';
SET
插入nls格式数据并查看,插入成功
unvdb=# insert into test_nls_date values(2, '24/04/15');
INSERT 0 1
unvdb=# select * from test_nls_date;
a | created_at
---+------------
1 | 24-04-05
2 | 24-04-15
(2 rows)
将date类型改为不经过nls处理,插入相同格式数据,如改成 1 (3,5,7等都可以),插入数据将报错,nls格式化将不对date的查询结果起效。
unvdb=# set unvdb_oracle.datetime_ignore_nls_mask to 1;
SET
unvdb=# insert into test_nls_date values(3, '24/05/15');
ERROR: date/time field value out of range: "24/05/15"
LINE 1: insert into test_nls_date values(3, '24/05/15');
^
HINT: Perhaps you need a different "datestyle" setting.
unvdb=# select * from test_nls_date;
a | created_at
---+------------
1 | 2024-04-05
2 | 2024-04-15
(2 rows)