表名大小写混合时格式问题及sys_dump导出时的注意事项

前言

前几天碰到同事咨询一个有关sys_dump导出时,表名为大小写混合情况的报错问题。因为sys_dump命令运行在linux操作系统上,所以这涉及到linux中shell的语法格式问题。

下面模拟测试一下

1,大小写敏感环境和不敏感环境建表的区别,以及表在数据字典中存储方式的区别。

2,sys_dump导出时表名为大小写混合时的格式问题

测试版本:

KingbaseES V008R006C006B0013

1、表名为大小写混合

表名大小写混合情况,需要区分大小写,无论create table ,select ..from table 等sql语句都需要在表名增加双引号:

TEST=# show enable_ci ;
 enable_ci
-----------
 on
 (1 row)

TEST=# create table dD (id int );
CREATE TABLE

TEST=# \dt
           List of relations
 Schema |    Name     | Type  | Owner
--------+-------------+-------+--------
 public | dd          | table | system

数据字典表的relname仍然是小写,说明创建表不加双引号,表名被装换成小写存入数据字典
TEST=# select  relname from pg_class where relname='dd';
 relname
---------
 dd
(1 row)

TEST=# select  relname from pg_class where relname='dD';
 relname
---------
(0 rows)
表名大小写混合加入双引号创建成功
create table "gD" (id int );

TEST=# \dt
           List of relations
 Schema |    Name     | Type  | Owner
--------+-------------+-------+--------
 public | dd          | table | system
 public | ddfg        | table | system
 public | gD          | table | system

数据字典表记录relname是大小写混合方式
TEST=# select  relname from pg_class where relname='gD';
 relname
---------
 gD
(1 row)

select语句涉及的表名要和sys_class里的relname一致。如果建表时指定表名为大小写混合需要双引号“gD”,那么select 语句中表名也需要加双引号“gD”
TEST=# select * from "gD";
 id
----
(0 rows)

TEST=# select * from 'gD';
错误: 语法错误 在 "'gD'" 或附近的
LINE 1: select * from 'gD';

大小写敏感与不敏感环境中,表名在数据字典中的存储方式:

大小写敏感环境:TEST=# show enable_ci ;
 enable_ci
-----------
 off
(1 row)
可以同时创建表名为小写和大小写混合的情况,例如:
TEST=# select relname from sys_class where relname='gD'or relname='gd';
 relname
---------
 gD
 gd
(2 rows)
大小写不敏环境:
TEST=# show enable_ci ;
 enable_ci
-----------
 on
(1 row)
数据字典里存了表名Ag,不允许再创建小写表ag,即无论表名为ag,Ag,AG只能创建其中一个表,而不能同时存在三张表名为小写,大写,大小写混合的表
TEST=# \d Ag
Table "public.Ag"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | |

TEST=# create table ag(id int);
ERROR: relation "ag" already exists
TEST=#
TEST=# select relname from sys_class where relname='ag'
TEST-# ;
relname
---------
Ag
(1 row)

TEST=# create table AG(id int);
ERROR: relation "AG" already exists

test=# create table ag(id int);
ERROR: relation "ag" already exists

2、sys_dump 导出表名为大小写混合时的格式问题

insert into "hGF" select generate_series(1,800);

TEST=# \d+ "hGF"
                                    Table "public.hGF"
 Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description
--------+---------+-----------+----------+---------+---------+--------------+-------------
 id     | integer |           |          |         | plain   |              |
Access method: heap


sys_dump -t "hGF"表名大小写混合时会报错。


[kingbase2@localhost V8]$ sys_dump -U system -d test -p 2920 -FC   -t "hGF"  -f /opt/Kingbase/ES/V8/dd1.dmp
sys_dump: error: no matching tables were found


改写成
sys_dump -U system -d test -p 2920 -FC   -t "\"hGF\""  -f /opt/Kingbase/ES/V8/db1.dmp
或
sys_dump -U system -d test -p 2920 -FC   -t '"hGF"' -f /opt/Kingbase/ES/V8/db2.dmp

shell中单引号内表示一个字符串,由于双引号有特殊含义,表示变量,需要转义符。

总结

1、表名为大小写混合情况,需要区分大小写,无论create table ,select ..from table 等sql语句都需要在表名增加双引号,以便表名以大小写方式存入系统表。

2、大小写敏感环境,表名可以同时以大写,小写,大小写混合方式存入系统表。

大小写不敏感环境,无论表名为大写,小写,大小写混合,只能将表名以其中一种方式存入系统表。

3、sys_dump 语法涉及表名时,注意shell对于双引号有特殊含义,需要加入转义符,或者使用单引号写法。

posted @ 2023-02-28 10:04  KINGBASE研究院  阅读(146)  评论(0编辑  收藏  举报