PostgreSQL 与大小写的“坑”。

本文探讨了PostgreSQL中字段值的大小写敏感性问题,包括如何通过统一大小写、建立唯一索引和使用ilike解决该问题。

其实每种数据库都有自己的特色,PostgreSQL 也不例外,其中如果你留心PostgreSQL被最常问及的问题之一,就是大小写的问题。今天的讨论不涉及数据库名,表名的大小写,仅仅讨论一下字段里面的值的大小写。

我们以一个例子为开始,

1 我们创建一个表

create table Case_insensitive

( id serial not null primary key, 

address varchar(50), 

comment text);

2 将数据库输入到里面

insert into case_insensitive (address,comment) values ("Person1@em.com","Thanks for your help!!");

insert into case_insensitive (address,comment) values ("TaTk@bb.com","I hate it");

insert into case_insensitive (address,comment) values ("ttKbb@cc.com","Sorry I am understanding now, little slowly");

那么大小写的问题在哪里?我们来查询一个数据大致你就会理解

从图中你可以清晰的看到,发生的问题在哪里,如果你的字段里面的值是包含英文大小写的情况下,你必须是要进行细致一致的大小写匹配才能找到相关的值。

而按照中国的人的思维方式,或者说用惯了其他主流数据库的情况下这样的必须匹配性的输入对中国人来说,是不友好的。

虽然题目中提到了"坑", 但实际上来说,这不是一个坑,或者严谨的来说,PostgreSQL这样的方式才应该是正确的。而很多时候先入为主,来判断POSTGRESQL 在这方面是有坑的,这并不公平。

那如何来解决这个世俗认为postgresql 应该和其他数据库一样使用习惯的方式问题。下面就要来说一说。

方法:1

统一规则:

我们将我们查询的字段,和需要查询的数据统一变成小写,通过 lower 这个函数来进行统一的转换。

从上图可以看出,我们可以将数据在输入纯小写的情况下,将数据查出。

问题又来了,这样的情况下能走索引吗?

答案是当然不能,函数的计算在条件左边的情况下大部分数据库都是不能走索引的,oracle 当然有类似的功能,能让一部分这样的情况走索引。PG 可以吗,当然,对标的就是ORACLE ,当然也可以当函数计算在左边的情况下,继续走索引。

怎么做???

变换思路,我们将索引的里面的字符都变小就可以了,看下图。

当然后面执行计划还未走索引得原因是数据量只有三条,不足以支撑走索引的cost.

那处理这样情况的方法到此为止了?  no no no  我们还有其他的方法供您选择。

2  有一种情况是,这一列例如是邮件地址,如果是邮件地址的情况下,是具有一种性质的,就是数据的唯一性。那如果 (请看图)

如果出现图中的情况,这可是不大美好的一件事情。如何来进行邮件地址的唯一性检查。我们可以提前为这列,建立一个唯一索引。

有了这样的索引大小写不一致的情况输入同样的字符就可以被管制了

当然如果这些你还有疑问,看看是不是还有其他的方法来对这样的事情进行处理。回答是YES

3  使用ilike

通过使用ilike的查询方式来查询大小写敏感的问题。

其实如果有规划的情况下,可以通过在输入时候的大小写输入的转换在insert 这个阶段就将问题处理清楚,并且辅助于一些约束。这样问题就比较好解决。

品略图书馆 http://www.pinlue.com/

 

<think>嗯,用户询问达梦数据库如何查看模式的大小写敏感设置。首先需要理解达梦数据库的架构特点,它通过实例级别的CASE_SENSITIVE参数统一控制所有对象的大小写敏感性,包括模式、表名、列名等。这意味着不存在单独针对"模式"的设置选项。 根据引用[1]提供的核心方法,可以通过SQL命令直接查询系统视图:SELECT CASE_SENSITIVE FROM V$DATABASE;。这个查询会返回1(敏感)或0(不敏感)的明确结果。这里需要特别提醒用户注意两点技术细节:一是该参数在实例初始化时就固定了,后期无法修改;二是所有对象都遵循这个全局设置。 引用[2]和[3]补充了重要背景:当CASE_SENSITIVE=1时,所有对象名必须严格匹配大小写,此时双引号包裹是强制规范;而设为0时系统会自动转换标识符大小写。这解释了为什么开发时会出现"无效的表名"错误——本质是大小写处理不匹配导致的对象查找失败。 用户可能混淆了"模式"和"实例"的设置层级,所以回复中需要明确:达梦没有独立的模式级别设置。但可以补充管理工具sqlLark的GUI查看方式作为辅助方案,毕竟有些DBA更习惯图形化操作。 考虑到用户可能是开发或运维人员,相关问题设计要侧重实用场景:既有基础设置确认方法(问题1),也包含开发时的避指南(问题2),还延伸了跨数据库对比(问题3)——这引用[2]的对比表格形成呼应。最后用"双引号使用规范"问题问题4)覆盖引用[3]的核心痛点。</think>在达梦数据库中,**模式(Schema)本身的大小写敏感性是由实例级别的全局参数 `CASE_SENSITIVE` 统一控制的**,无法单独为某个模式设置独立的大小写敏感规则。要查看当前实例的大小写敏感设置(该设置会影响所有对象,包括模式、表名、列名等),请使用以下方法: ### 📌 查看方法 1. **通过 SQL 命令查询** (推荐) 执行以下 SQL 语句: ```sql SELECT CASE_SENSITIVE FROM V$DATABASE; ``` - **返回值 `1`**:表示当前实例 **大小写敏感**(区分大小写)[^1][^2]。 - **返回值 `0`**:表示当前实例 **大小写不敏感**(不区分大小写)[^1][^2]。 2. **通过管理工具查看** 在达梦管理工具(如 `sqlLark`)中,可通过图形界面查看实例属性中的 `CASE_SENSITIVE` 参数值。 --- ### ⚠️ 重要说明 1. **全局性设置** `CASE_SENSITIVE` 是**实例初始化时确定的参数,后续无法修改**。若需调整大小写敏感性,必须重新初始化实例[^1]。 2. **对模式的影响** - **大小写敏感 (`CASE_SENSITIVE=1`)** 创建模式时需严格匹配大小写,例如模式 `"MySchema"` 和 `"myschema"` 会被视为不同对象。访问时需用双引号包裹正确的大小写名称(如 `SELECT * FROM "MySchema".table`)[^2][^3]。 - **大小写不敏感 (`CASE_SENSITIVE=0`)** 所有模式名会被自动转换为大写(如 `myschema` → `MYSCHEMA`),无需使用双引号[^2]。 --- ### 📎 示例 ```sql -- 查询实例大小写设置 SELECT CASE_SENSITIVE FROM V$DATABASE; -- 返回 1(敏感)或 0(不敏感) -- 大小写敏感时访问模式 SELECT * FROM "MySchema".table; -- 正确:双引号+精确大小写 -- 大小写不敏感时访问模式 SELECT * FROM myschema.table; -- 正确:自动转为大写 MYSCHEMA ``` --- ### ⚖️ 其他数据库对比 | 数据库 | 用户名/模式大小写处理规则 | |--------------|-----------------------------------------------| | **达梦 (DM)** | 由 `CASE_SENSITIVE` 全局控制,严格区分大小写 | | Oracle | 默认不区分,双引号强制区分(自动转大写) | | PostgreSQL | 默认不区分,双引号强制区分(自动转小写) | | MySQL | 由 `lower_case_table_names` 参数配置 | --- ### ❓相关问题 1. **达梦数据库大小写敏感时,如何正确创建和访问包含小写字母的模式?** 2. **如果初始化实例时未正确设置大小写敏感参数,后续如何补救?** 3. **达梦其他数据库(如 Oracle/MySQL)在大小写处理上有哪些关键区别?** 4. **在大小写敏感的达梦实例中,为什么查询时报错“无效的表或视图名”?如何解决?**[^3] [^1]: 达梦实例大小写敏感设置通过 `CASE_SENSITIVE` 参数控制,初始化后不可修改。 [^2]: 大小写敏感性影响所有对象访问规则,需严格匹配大小写或使用双引号。 [^3]: 大小写敏感时未用双引号包裹对象名会导致识别失败。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值