LIKE与等式查询比较
我们知道 char 是定长类型的数据,如果数据长度小于定义的长度,会在字符串尾部加上空格。而对于空格的处理,对于等式匹配,或length等,会忽略空格。而对于like 或模式匹配,空格不能忽略。
一、对于系统自动补全的空格
1、数据类型为varchar
对于varchar 类型,由于字符串尾部没有补全空格,like 与 等式比较结果没有区别。
testdb=# create table tab1(id varchar(9));
CREATE TABLE
testdb=# insert into tab1 values('123');
INSERT 0 1
testdb=# select * from tab1 where id='123';
id
-----
123
(1 row) testdb=# select * from tab1 where id like '123';
id
-----
123
(1 row)
2、数据类型为char
对于char类型,字符串后会补全空格字符。对于等式匹配,这种空白字符会忽略;对于模式匹配(like 或正则匹配),则会考虑空白字符。
testdb=# create table tab2(id char(9));
CREATE TABLE
testdb=# insert into tab2 values('123');
INSERT 0 1
testdb=# select * from tab2 where id='123';
id
-----------
123
(1 row) testdb=# select * from tab2 where id like '123';
id
----
(0 rows)
二、对于数据自身带的空格
这里的空格是指字符串自身带的最后的空格。
1、数据类型为Varchar
对于varchar 类型的空格,在比较时,会比较空格。
testdb=# create table tab3(id varchar(9));
CREATE TABLE
testdb=# insert into tab3 values('123 ');
INSERT 0 1
testdb=# select * from tab3 where id='123';
id
----
(0 rows) testdb=# select * from tab3 where id like '123';
id
----
(0 rows)
2、数据类型为char
插入的空格与系统自动补全的空格是一样的。
testdb=# create table tab4(id char(9));
CREATE TABLE
testdb=# insert into tab4 values('123 ');
INSERT 0 1
testdb=# select * from tab4 where id='123';
id
-----------
123
(1 row) testdb=# select * from tab4 where id like '123';
id
----
(0 rows) testdb=# select length(id) from tab4;
length
--------
3
(1 row)
三、对于varchar 与char 类型的空格
对于varchar 与 char,最后的空格是不一样的。
testdb=# select length(substr(id,4,1)) from tab3;
length
--------
1
(1 row) testdb=# select length(substr(id,4,1)) from tab4;
length
-------- (1 row)
再看个例子:
--KingbaseES
test=# select length(substr('1 3 '::char,2,1)),length(substr('1 3 '::char,4,1)) from dual;
length | length
--------+--------
|
(1 row) test=# select length(substr('1 3 '::varchar,2,1)),length(substr('1 3 '::varchar,4,1)) from dual;
length | length
--------+--------
1 | 1
(1 row) --Postgresql
testdb=# select length(substr('1 3 '::char,2,1)),length(substr('1 3 '::char,4,1)) ;
length | length
--------+--------
0 | 0
(1 row) testdb=# select length(substr('1 3 '::varchar,2,1)),length(substr('1 3 '::varchar,4,1)) ;
length | length
--------+--------
1 | 1
(1 row)
四、oracle 的 char 与 varchar
可以看到,二者是没有区别的。
SQL> create table tab1(id1 char(9),id2 varchar(9));
Table created.
SQL> insert into tab1 values('1 3 ','1 3 ');
1 row created.
SQL> select length(substr(id1,2,1)),length(substr(id1,5,1)),length(substr(id2,2,1)) from tab1;
LENGTH(SUBSTR(ID1,2,1)) LENGTH(SUBSTR(ID1,5,1)) LENGTH(SUBSTR(ID2,2,1))
----------------------- ----------------------- -----------------------
1 1 1
LIKE与等式查询比较的更多相关文章
- 【转】Oracle索引的类型
数据库的应用类型分为 OLTP(OnLine Transaction Processing ,联机事务处理):OLTP是传统关系型数据库的主要应用,其主要面向基本的.日常的事务处理,例如银行交易. O ...
- mysql高性能索引策略
转载说明:http://www.nyankosama.com/2014/12/19/high-performance-index/ 1. 引言 随着互联网时代地到来,各种各样的基于互联网的应用和服务进 ...
- 【翻译】从头开始写一个时间序列数据库-Writing a Time Series Database from Scratch
本文来自: https://fabxc.org/tsdb/, 如翻译有误,请纠正. 我是从事监控工作的.特别是Prometheus, 一个包含自定义的时间序列库以及集成Kuberntes的监控系统. ...
- 【翻译】ScyllaDB数据建模的最佳实践
文章翻译自Scylla官方文档:https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ 转载请注明出处:https: ...
- SQL Server 数据库子查询基本语法
一.SQL子查询语句 1.单行子查询 select ename,deptno,sal from emp where deptno=(select deptno ...
- 类型转换bin()、chr()、ord() 、int()、float()、str()、repr()、bytes()、tuple(s )、 list(s ) 、unichr(x ) 、 ord(x ) 、 hex(x ) 、 type()数据类型查询
1.bin() 将整数x转换为二进制字符串,如果x不为Python中int类型,x必须包含方法__index__()并且返回值为integer: 参数x:整数或者包含__index__()方法切返回值 ...
- 高性能MySQL笔记 第6章 查询性能优化
6.1 为什么查询速度会慢 查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...
- Elasticsearch查询
Elasticsearch支持两种类型的查询:基本查询和复合查询. 基本查询,如词条查询用于查询实际数据. 复合查询,如布尔查询,可以合并多个查询, 然而,这不是全部.除了这两种类型的查询,你还可以用 ...
- MS SQL SERVER索引优化相关查询
查找缺失索引 -- ============================================= -- Description: 查询当前数据库中缺失的索引,知道你进行优化的 ...
随机推荐
- PTA(BasicLevel)-1094 谷歌的招聘
一.问题定义 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址, 而前面的网址是一个 10 位素数,这个素数 ...
- 静态static关键字修饰成员方法和静态static的内存图
当 static 修饰成员方法时,该方法称为类方法 .静态方法在声明中有 static ,建议使用类名来调用,而不需要 创建类的对象.调用方式非常简单 ~类方法:使用 static关键字修饰的成员方法 ...
- HashMap设计原理与实现(下篇)200行带你写自己的HashMap!!!
HashMap设计原理与实现(下篇)200行带你写自己的HashMap!!! 我们在上篇文章哈希表的设计原理当中已经大体说明了哈希表的实现原理,在这篇文章当中我们将自己动手实现我们自己的HashMap ...
- 千位分隔符在web开发中的作用
有千位分隔符会被认为是数字,否则在移动端会被直接识别成手机号 在开发实战中主流实现方式是添加meta标签 <meta name="format-detection" cont ...
- centos一些mysql常用命令
# service mysqld status #命令来查看mysql 的启动状态,active (running) 是运行中 systemctl start mysqld.service ...
- 零基础学Java(9)在mac上运行命令行提示"找不到或无法加载主类"
天坑 遇到的问题:使用命令行执行命令:java EightSample,会报以下错误 错误: 找不到或无法加载主类 EightSample 运行环境 mac系统 IntelliJ IDEA编译器 Ja ...
- 常用的函数式接口_Function接口练习_自定义函数模型拼接
package com.yang.Test.FunctionStudy; import java.util.function.Function; /** * 练习:自定义函数模型拼接 * 题目: * ...
- break和continue语句的使用
break break关键字的用法有常见的两种: 1.可以用在switch语句当中,一旦执行整个switch语句like结束. 2.还可以用在循环语句当中,一旦执行,整个循环语句立刻结束,打断循环 关 ...
- Splash (渲染JS服务)介绍安装
一. splash介绍 1.Splash 是一个带有 HTTP API 的 javascript 渲染服务.它是一个带有 HTTP API 的轻量级浏览器,使用 Twisted 和 QT5 在 Pyt ...
- Dubbo源码(五) - 服务目录
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 今天,来聊聊Dubbo的服务目录(Directory).下面是官方文档对服务目录的定义: 服务目 ...