暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

新手必读:磐维数据库lower_case_table_names参数的那些事儿

原创 飞天 2025-03-13
122

问题引出

在磐维数据库的使用过程中,参数配置至关重要。其中,lower_case_table_names 参数的设置,常常容易被新手忽视,进而引发各种问题。最近多次看到大家因为lower_case_table_names参数设置不当导致返工的问题。所以,在项目启动初期,仔细检查各项参数,确保关键参数和前置条件准确无误,是保障项目顺利推进、按时交付高质量成果的关键。接下来,我们就通过具体实验,深入了解一下这个参数的作用与影响。

lower_case_table_names参数说明

参数说明: 在 MySQL 兼容模式下,控制表名的大小写敏感特性。该参数属于 POSTMASTER 类型参数,数据库服务端参数,在数据库启动时确定,可以通过配置文件指定。 【须知】 该功能仅在数据库兼容模式为 MySQL 时能够使用(即数据库实例初始化时指定 DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用该特性。 取值范围: 0,1 - 0:对象名使用创建时的大小写样式保存,在比较判断时使用大小写敏感的方式。 - 1:对象名统一使用小写样式保存,在比较判断时使用大小写不敏感的方式。 默认值: 0
复制

实验过程

检查数据库中默认参数设置

gsql -c "show lower_case_table_names;"
复制

执行结果如下:

[omm@node1 ~]$ gsql -c "show lower_case_table_names;" lower_case_table_names ------------------------ 0 (1 row)
复制

lower_case_table_names参数默认为0,即:表名区分大小写。

构造数据并验证参数的行为

create table TEST (ID int); \d select * from test; select * from "test"; select * from TEST; select * from "TEST";
复制

执行过程如下:

#创建大写表名的TEST表 postgres=# create table TEST (ID int); CREATE TABLE postgres=# \d List of relations Schema | Name | Type | Owner | Storage --------+-------------------------------+-------+-------+------------------------------------------------ public | TEST | table | omm | {orientation=row,compression=no,fillfactor=80} public | pg_type_nonstrict_basic_value | view | omm | public | pw_login_info | view | omm | (3 rows) 可以看到,数据库中存的是大写的表名TEST#使用小写的表名查数据 postgres=# select * from test; ERROR: relation "test" does not exist on dn_6001_6002_6003 <----------查询异常 LINE 1: select * from test; ^ #使用带双引号的小写表名查数据 postgres=# select * from "test"; ERROR: relation "test" does not exist on dn_6001_6002_6003 <----------查询异常 LINE 1: select * from "test"; ^ #使用大写的表名查数据 postgres=# select * from TEST; <----------查询正常 ID ---- (0 rows) #使用带双引号的大写表名查数据 postgres=# select * from "TEST"; <----------查询正常 ID ---- (0 rows)
复制

总结,当数据库参数lower_case_table_names=0时,表名是区分大小写的,创建表的时候使用了大写的表名,数据库中存的是大写的表名,并且使用小写的表名以及带双引号的小写表名都无法查询数据,使用大写的表名以及带双引号的大写表名都可以查询数据。

修改参数并重启数据库

gs_guc set -N all -D /data/panweidb/data -c "lower_case_table_names=1" gs_om -t restart
复制

执行过程如下:

[omm@node1 ~]$ gs_guc set -N all -D /data/panweidb/data -c "lower_case_table_names=1" The pw_guc run with the following arguments: [gs_guc -N all -D /data/panweidb/data -c lower_case_table_names=1 set ]. Begin to perform the total nodes: 3. Popen count is 3, Popen success count is 3, Popen failure count is 0. Begin to perform gs_guc for datanodes. Command count is 3, Command success count is 3, Command failure count is 0. Total instances: 3. Failed instances: 0. ALL: Success to perform gs_guc! [omm@node1 ~]$ gs_om -t restart Stopping cluster. ========================================= Successfully stopped cluster. ========================================= End stop cluster. Starting cluster. ====================================================================== Successfully started primary instance. Wait for standby instance. ====================================================================== . Successfully started cluster. ====================================================================== cluster_state : Normal redistributing : No node_count : 3 Datanode State primary : 1 standby : 2 secondary : 0 cascade_standby : 0 building : 0 abnormal : 0 down : 0 Successfully started cluster.
复制

检查数据库中的参数设置

gsql -c "show lower_case_table_names;"
复制

执行过程如下:

[omm@node1 ~]$ gsql -c "show lower_case_table_names;" lower_case_table_names ------------------------ 1 (1 row)
复制

再次构造数据并验证参数的行为

create table TESTNEW (ID int); \d select * from testnew; select * from "testnew"; select * from TESTNEW; select * from "TESTNEW";
复制

执行过程如下:

#创建大写表名的TEST表 postgres=# create table TESTNEW (ID int); CREATE TABLE postgres=# \d List of relations Schema | Name | Type | Owner | Storage --------+-------------------------------+-------+-------+------------------------------------------------ public | TEST | table | omm | {orientation=row,compression=no,fillfactor=80} public | pg_type_nonstrict_basic_value | view | omm | public | pw_login_info | view | omm | public | testnew | table | omm | {orientation=row,compression=no,fillfactor=80} (4 rows) 可以看到,数据库中存放的是小写的表名testnew。 #使用小写的表名查数据 postgres=# select * from testnew; <----------查询正常 id ---- (0 rows) #使用带双引号的小写表名查数据 postgres=# select * from "testnew"; <----------查询正常 id ---- (0 rows) #使用大写的表名查数据 postgres=# select * from TESTNEW; <----------查询正常 ID ---- (0 rows) #使用带双引号的大写表名查数据 postgres=# select * from "TESTNEW"; ERROR: relation "TESTNEW" does not exist on dn_6001_6002_6003 <----------查询异常 LINE 1: select * from "TESTNEW"; ^ postgres=#
复制

总结,当数据库参数lower_case_table_names=1时,表名是不区分大小写的。创建表的时候使用了大写的表名,数据库中存的是小写的表名,并且使用小写的表名、带双引号的小写表名、大写表名都可以查询数据,使用带双引号的大写表名不可以查询数据。

修改参数后再查询修改参数前创建的表

select * from test; select * from "test"; select * from TEST; select * from "TEST";
复制
#使用小写的表名查数据 postgres=# select * from test; ERROR: relation "test" does not exist on dn_6001_6002_6003 <----------查询异常 LINE 1: select * from test; ^ #使用带双引号的小写表名查数据 postgres=# select * from "test"; ERROR: relation "test" does not exist on dn_6001_6002_6003 <----------查询异常 LINE 1: select * from "test"; ^ #使用大写的表名查数据 postgres=# select * from TEST; ERROR: relation "test" does not exist on dn_6001_6002_6003 <----------查询异常 LINE 1: select * from TEST; ^ #使用带双引号的大写表名查数据 postgres=# select * from "TEST"; <----------查询正常 id ---- (0 rows) postgres=#
复制

总结,当把数据库参数lower_case_table_names修改为1后,再查询修改参数之前(lower_case_table_names为0时)创建的大写表名的表,只能用带双引号的大写表名来访问,也可以这么说,数据库参数lower_case_table_names修改为1后,只会对后面新创建的表生效。

总结

通过以上实验,我们对磐维数据库的 lower_case_table_names 参数有了全面的了解:

  • 当数据库参数lower_case_table_names=0时,表名是区分大小写的,创建表的时候使用了大写的表名,数据库中存的是大写的表名,并且使用小写的表名以及带双引号的小写表名都无法查询数据,使用大写的表名以及带双引号的大写表名都可以查询数据。
  • 当数据库参数lower_case_table_names=1时,表名是不区分大小写的。创建表的时候使用了大写的表名,数据库中存的是小写的表名,并且使用小写的表名、带双引号的小写表名、大写表名都可以查询数据,使用带双引号的大写表名不可以查询数据。
  • 当把数据库参数lower_case_table_names修改为1后,再查询修改参数之前(lower_case_table_names为0时)创建的大写表名的表,只能用带双引号的大写表名来访问,也可以这么说,数据库参数lower_case_table_names修改为1后,只会对后面新创建的表生效。

希望大家在使用磐维数据库时,能够充分重视这个参数的设置,避免因参数问题导致不必要的麻烦。

关于作者:
网名:飞天,墨天轮2024年度优秀原创作者,拥有 Oracle 10g OCM 认证、PGCE认证以及OBCA、KCP、ACP、磐维等众多国产数据库认证证书,目前从事Oracle、Mysql、PostgresSQL、磐维数据库管理运维工作,喜欢结交更多志同道合的朋友,热衷于研究、分享数据库技术。
微信公众号:飞天online
墨天轮:https://www.modb.pro/u/15197
如有任何疑问,欢迎大家留言,共同探讨~~~

最后修改时间:2025-03-14 14:53:45
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论