GaussDB(DWS) 特殊对象名
一些常见的特殊对象名:
含$:没有什么特殊含义,oracle内部表或临时表一般这样命名。其他数据库的管理员可能遵从这种命名习惯。
含@:在oracle中的dblink,访问远程数据库中的表名, 如tablename@dbserver。而表名本身含有@,需要将@用双引号括起来。
含有大写字母:数据库默认会将大写字母转为小写,对象名含有大写字母的需要用双引号括起来。
首字母为数字:以数字为开头的对象名
中文字符:含中文字符的对象名,可读性强但是需要注意编程语言的编解码格式。
含有不同特殊字符名的数据库对象,在创建时行为可能有所不同:
创建以$开头的表名:
创建含有$的表名,此时没有用双引号括起来:
创建含有$的表名,此时用双引号括起来:
由此可见,表名中含有$符号,是否用双引号括起来行为都保持一致。而创建一个含有@字符的表名,或首字母为数字,如下图所示,则必须用双引号括起来:
含中文字符的场景,无需加双引号。
在开发过程中,程序员往往可以使用regclass来获取唯一的表名,regclass是数据库中oid的别名,如tablename::regclass,此时数据库返回的表名会默认自动加上双引号。
regclass的内核处理逻辑是字符中除英文字母(小写)开始含下划线的表名,都默认加双引号返回,与数据库表名的创建逻辑并不完全一致,并且其处理效率为线性增长。因此,在使用regclass的sql开发过程中,需要根据效率要求以及一致性需求来进行开发,中文字符,下划线开头等场景可以不用加双引号进行处理,而其他特殊字符却需要加双引号才能正确识别。
二义性
在备份工具Roach的使用过程中,特殊表名的使用需要加上双引号,而因为python语言会默认将双引号 包围的字符串直接透传,导致传入的字符串两侧并没有双引号,例如“public.test”传入后实际为‘public.test’,单表备份恢复要将双引号传入需要两侧再加‘’,如‘“public.test”’。
总结上述场景,含有特殊字符的 表名使用过程中均可以加上双引号,但因此却带来了一些二义性问题,例如:
我们在使用数据库表名时,往往加上schema名,例如public.test,此时‘.’ 为分隔符。而数据库表名也可以包含‘.’,如下图,这里表示创建表名称为public.test的表名。
而在数据库使用过程中,数据库对象也可以以‘.’命名。
这些使用方法在实际过程中,会大大降低易用性与效率。因而制定一套符合公司习惯的对象名命名规范是即为必要的,推荐数据库管理员指定符合自身习惯的对象名命名规范。
推荐使用规范
数据库对象名规范,例:
- 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔
- 全部小写命名,禁止出现大写
- 禁止使用数据库关键字,如:name,time ,datetime,password等
- 表名称不应该取得太长(一般不超过三个英文单词)
- 表的名称一般使用名词或者动宾短语
- 用单数形式表示名称,例如,使用 employee,而不是 employees
字段命名规范可以参考对象名规范
总结:
为保证应用效率,特殊对象名对于数据库软件开发与使用,推荐制定对象名命名规范并严格遵守;对于内核及数据库平台开发,对于特殊对象名的处理需要保持前后一致性及处理效率。
- 点赞
- 收藏
- 关注作者
评论(0)