前言
前几天碰到同事咨询一个有关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对于双引号有特殊含义,需要加入转义符,或者使用单引号写法。