数据库大小写问题可以说让很多用数据库的人感受是:建表时,哇建出来了;使用时,我去,怎么找不到表,怎么找不到字段。没事,这是小场面。
先说为什么是坑及解决办法
说是坑的原因是:数据库在大小写敏感的配置下创建,如果修改为大小写不敏感后,原来创建的区分大小写的表名就不能访问。
如何避免:所有的库名,表名,字段名使用小写,单词用下划线"_"间隔,所有命名中,不允许使用 反引号,双引号包裹,ODS 层遇到特别骚的,需要提审批。这个规则保你在数据库使用达到 95% 以上的幸福。好了,没时间的同学,读到这里就可以撤了。
这篇文章对于工作中使用到多种类型数据库的朋友有一定的参考及帮助。
发个朋友圈交流时,还有不显事大的,要把双引号,单引号,反引号带上~~~。唉,这些都是泪啊。那么我也看看看不同的数据库,这块有多骚吧!这块如同迷宫,每个数据库都能自圆其说,所以我把 research 的过程列举一下,以供大家参考,研究的对象:Snowflake, Databend, MySQL, PostgreSQL。
-
库名和表名是不是支持大小写敏感,双引号,单引号,反引号在这里面扮演的角色。
-
字段名是不是支持大小写敏感
-
字段的内容对于大小写处理的特点
-
双引号和单引号在字符串上的区别
每个步骤,我会加上一个例来讲解。
1、库名和表名大小写问题
库名和表名的规则一样,这里只用一个表名表示
接下来请看表演
看起来一切完美,按着规则来非常丝滑。 记住一个口诀,可能就会好很多:
-
Snowflake 默认支持大小写敏感,需要用:双引号包裹,需要严格遵守。反引号是表名中的一部分
-
Databend 默认支持大小写敏感,兼容了 Pg 和 MySQL 两种风格的大小写
-
MySQL 在 Linux 下默认支持大小写敏感,需要有反引号包裹
-
PostgreSQL 是默认支持大小写敏感感,需要用双引号包裹
整体上说,如果你创建表的时间是什么样,访问的时写成什么样,问题不大。
2. 字段是否支持大小写
字段大小写, 不要惊讶,例如(大小写敏感所在要加上双引号或是反引号),如果区分大小敏感:Aa 和 AA 就是不同的字段:
第一个语句可以在 Snowflake , Databend, PostgreSQL 中执行, "Aa" , "AA" 是两个不同的字段。第二个句可以在 Databend 中执行,也是两个独立的字段。
到这里 MySQL 不跟了, MySQL 在字段上不区分大小写。MySQL 字段命名也可以用反引号包裹,但这块规则和表名库名不一致。
在字段大小写一项上, MySQL 有点没骚起来,不支持字段的大小写
Databend
3. 字段的内容对于大小写处理的特点
这块 MySQL 玩更风骚了,显示支持大小写,但过滤默认不支持字符型的大小区别(如果需要,请了解一下校验字符集)
看演示:
在 Snowflake, Databend ,PostgreSQL 中可以精确显示出来:
4. 双引号和单引号在字符串上的区别
在谈这个问题的时间如果你是一个 MySQL 用户,可能从来都不知道这两个还有啥区别吗?MySQL 中单引号和双引号引起来的字符串都是 string ,在 MySQL 中可以
MySQL 在字段串这块单引号和双引号没区别,随意用。但 MySQL 约定用反引号包裹是表示字段或是关键词。
但是到 Snowflake, Databend, PostgreSQL 中,这块有非常大的区别。
在这个三个数据库中, 双引号包裹的会被自动识别为关键词或字段,单引号包裹的才是字符串。
所以
你能体会到最后一个为什么是正确的,你差不多就 get 到这三个数据库在双引号和单引号的区别了。
总结
好了,看到这里。不知道你是不是学废了。如果为了省事,也可以直接记结论就好。把下面字段命名及使用中的规则写到部门的数据开发规范里
-
【强制】库名、表名限制命名长度,建议表名及字段名字符总长度小于等于63。
-
【强制】对象名(表名、列名、函数名、视图名、序列名、等对象名称)规范,对象名务必只使用小写字母,下划线,数字。不要以数字开头,不要使用保留字。
-
【强制】query中的别名不要使用 "小写字母,下划线,数字" 以外的字符
-
【强制】如果你使用了双引号,反引号创建的字段。尽量使用中带着双引号或是反引号
有朋友也许会好奇,为什么还要出现这种反引号,或是双引号包裹的设计呢?全部小写不就行了吗? 和大数据领域的朋友交流一下,主要是为了 ODS 和原数据层对齐,字段中可能出现复杂的字符。
如果你觉得一切都看完了,也可以添:82565387 来感受一下直播中错误及如何实现从大小写敏感切换到大小写不敏感。
想一下,这块不同的数据还有挺多不一样的地方值得去探索一下,例如: 单表支持最多少字段,SQL 支持最大长度 等等。 不同数据的默认值都不一样,后续找机会再聊。