《SQL与关系数据库理论——如何编写健壮的SQL代码》一2.8 SQL中的字符序

简介: 本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第2章 ,第2.8节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

本节书摘来华章计算机《SQL与关系数据库理论——如何编写健壮的SQL代码》一书中的第2章 ,第2.8节 C. J. Date 著 单世民 何英昊 许侃 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.8 SQL中的字符序

SQL中涉及类型检查和型转的规则尤其是在字符串场合下的规则,要远比我到目前为止所假设的复杂,所以我要详细说说。实际上,在一本书中对这点最多只能说说皮毛,其基本的思想是:任何确定的字符串都由取自相关字符集(character set)的字符组成,并且都有一个关联的字符序(collation)。字符序是与特定字符集相关,并决定着由特定字符集的字符所组成的字符串的比较规则,也叫做核对序列(collating sequence)。设C是对应于字符集S的字符序,a和b是字符集S中的任意字符,则C必使比较表达式ab之一为真,其余为假。注意:在SQL的早期版本中只有一个字符集,其中只有一个字符序,并且此字符序所基于的还是字符集中用于表示字符的二进制码的顺序。但是,现在已经没有理由要求核对序列必须依赖于内部编码方案了,并且实际上有很好的理由要求它们不应该依赖内部编码方案。
基本思想就这么多。然而,还有些变数。其中之一源于任何确定的字符序都有PAD SPACE或NO PAD。假设字符串“AB”和“AB ”(注意第二个字符串尾部的空格)具有相同的字符集和字符序。显然,两个字符串是不同的,可是如果使用PAD SPACE则两者可认为是“比较上相等的(compare equal)”。建议:别用PAD SPACE——如果可能就一直用NO PAD。不过要注意,PAD SPACE和NO PAD的选择只会影响比较运算而已,对于赋值是没有差别的。注18
另一个变数在于:对确定的字符序,即使字符a和b不同,比较表达式a=b也可能返回TRUE。比如,定义名为CASE_INSENSITIVE的字符序,其中每个小写字母都被定义为与对应的大写字母比较上相等。因此,明显不同的字符串有时也会比较上相等。
所以,可以看到SQL中的某些v1=v2形式比较表达式即使是在v1和v2不同的情况下,也可以返回TRUE(即使它们是不同的类型也可能比较上相等,这都是因为SQL对型转的支持造成的)。我会用“相等但可区分(equal but distinguishable)”表示这样的值对(pair of values)。现在,相等比较在很多上下文(比如MATCH、LIKE、UNIQUE、UNION和JOIN)中执行(常常是隐式地),而所用的相等性实际上是“即使可区分也相等(equal even if distinguishable)”。举个例子,假设CASE_INSENSITIVE字符序如上所述定义,并将PAD SPACE用于此字符序。那么,如果表P及表SP的PNO列都使用此字符序,且表P和表SP中某行的PNO值分别是“P2”和“p2 ”,则这两行会被认为满足SP到P的外键约束,而无视外键值中的小写“p”和其尾部的空格。
而且,当计算表达式包含UNION、INTERSECT、EXCEPT、JOIN、GROUP BY、DISTINCT等运算符时,系统可能不得不从众多相同但可区分的值中选出一个作为结果中某行某列的值。不幸的是,SQL本身对此种情况没有给出完整的解决方案。结果是,在SQL没有完全说明该如何计算的情况下,一些表表达式无法得到确定的值(实际上,它们应该对不同的情况给出不同的结果)——SQL的术语是“可能非确定性的(possibly nondeterministic)”。比如,如果字符序CASE_INSENSITIVE用于表T的列C,那么即使T不发生任何变化,SELECT MAX(C) FROM T 也可能视情况返回“ZZZ”或“zzz”。
我不会对“可能非确定性的”表达式给出SQL准则(参见第12章中的深入讨论)。然而,必须提到的是,这种表达式不允许出现在完整性约束中(参见第8章),因为它们会导致不可预期的更新失败。因此要特别注意,此规则暗示了很多包含字符串类型列的表表达式(有时甚至是简单的SELECT表达式)都允许存在于约束之中!强烈建议:竭尽所能地避开“可能非确定性的”表达式。

相关实践学习
MySQL数据库快速部署实践
本场景主要介绍如何在一台配置了CentOS 7.7版本的ECS实例(云服务器)上安装mysql,执行mysql的常用操作,学习基本的SQL语句。
相关文章
|
存储 关系型数据库 数据库
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
本文通过一个 Agentic RAG 应用的完整构建流程,展示了如何借助 RDS Supabase 快速搭建具备知识处理与智能决策能力的 AI 应用,展示从数据准备到应用部署的全流程,相较于传统开发模式效率大幅提升。
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1975 152
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1368 156
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
1819 213
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
988 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
582 6
SQL中如何将一列中的值显示出字符指定位置与指定长度
在对比系统生日与身份证号时,如何提取特定位置的值?例如,从身份证第7位开始取8位数字,可用SQL的`SUBSTRING`函数实现。
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
825 8

热门文章

最新文章