3.放弃CHAR吧,在铸成大错之前!
/*************************************************
三、主题:放弃CHAR吧,在铸成大错之前!
CHAR,定长,长度不足时,会在尾部补空格。
VARCHAR,不定长,长度不一定达到最大值。
*************************************************/
=============================================================================
3.1.length,返回字符长度的函数
The LENGTH functionsreturn the length of char. LENGTH calculates length usingcharacters as defined by the input character set.
--返回以字符为单位的长度.
LENGTHB usesbytes instead of characters.
--返回以字节为单位的长度.
LENGTHC usesUnicode complete characters.
--返回以Unicode完全字符为单位的长度.
LENGTH2 usesUCS2 code points.
--返回以UCS2代码点为单位的长度.
LENGTH4 usesUCS4 code points.
--返回以UCS4代码点为单位的长度.
=============================================================================
CREATE TABLE TEST4
(
C CHAR(4),
VC VARCHAR(4),
NC VARCHAR(4)
);
INSERT INTO TEST4 VALUES('1','12','10');
INSERT INTO TEST4 VALUES('3','3','210');
INSERT INTO TEST4 VALUES(' ','110','1300');
INSERT INTO TEST4 VALUES('25',' ','9');
INSERT INTO TEST4 VALUES('AA','HE','50');
=============================================================================
3.2.CHAR 与 VARCHAR 的长度
SELECT C,LENGTH(C),VC,LENGTH(VC) FROM TEST4;--查询结果:其中有C='1 ',明显可以看到后面有空格
SELECT C,LENGTH(C),LENGTHB(C),LENGTHC(C),DUMP(C),--DUMP:其中有C='1 '时,Typ=96 Len=4: 49,32,32,32,后面三个32表示空格
VC,LENGTH(VC),LENGTHB(VC),LENGTHC(VC),DUMP(VC)--DUMP:明显的区别,实际的长度,而不是最大长度
FROM TEST4;
3.3.比较大小(常规字符型)
SELECT C,DUMP(C)
FROM TEST4 ORDER BY C;--排序结果:' ' ,'1','25','3','AA'
SELECT VC,DUMP(VC)
FROM TEST4 ORDER BY VC;--排序结果:' ','110','12','3','HE'
3.4.数值在排序中的效果比较,重要应用:字符型存储数据全为数字时。
SELECT NC,DUMP(NC)
FROM TEST4
ORDER BY NC;--排序结果:10,1300,210,50,9
--若是想将全为数字的字符型进行排序,ORDER BY C+0 或者 ORDER BY TO_NUMBER(NC) 即可
SELECT NC,DUMP(NC)
FROM TEST4
ORDER BY NC+0;--排序结果:9,10,50,210,1300
SELECT NC,DUMP(NC)
FROM TEST4
ORDER BY TO_NUMBER(NC);--排序结果:9,10,50,210,1300
3.5.字符串的比较
填补空格的比较规则:若是长度不同,会在短的后面填补空格,等长度一致后比较;
自左往右顺序比较,直到比较出不一致,或者比较完成。
(1)单纯的字面值
SELECT * FROM TEST4 WHERE C='1'; --能查出结果,正确的
(2)VARCHAR 的值不会填补空格,所以TEST4的 CHAR '1 ' 与 TEST1的 VARCHAR2 '1' 不同
SELECT * FROM TEST4 WHERE C IN (SELECT NAME FROM TEST1);--0行被选择,无查询结果,其实TEST1 里面有 '1'.
--原因
SELECT DUMP(C),DUMP(NAME)
FROM TEST4,TEST1
WHERE TEST4.C='1'
AND TEST1.NAME='1'
结果:Typ=96 Len=4: 49,32,32,32 ; Typ=1 Len=1: 49.
(3)要想得出正确结果,所以经常有 TRIM,RPAD 函数出现,但是不推荐
SELECT * FROM TEST4 WHERE TRIM(C) IN (SELECT NAME FROM TEST1);--TEST4 清除空格, 查询结果有值
SELECT * FROM TEST4 WHERE C IN (SELECT RPAD(NAME,4) FROM TEST1); --TEST1 填充空格,查询结果有值
--若是有CHAR存在,每次比较时,可能就要加上一些字符的函数。
--CHAR浪费空间,并且可能查询中连索引都使用不上。
3.6.结论:放弃CHAR吧,在铸成大错之前!
转载于:https://www.cnblogs.com/zihuancc/p/3816454.html
3.放弃CHAR吧,在铸成大错之前!相关推荐
- 【C++标准库】std::string用法指南源码剖析
文章目录 1.ASCII码 (1)计算机如何表达字符 2.C 语言中的字符类型 char (1)思想:char 即整数 (3)C 语言帮手函数 (4)C语言中的字符串 (4)C 语言转义符 3.C++ ...
- char的初始值_java从入门到放弃 各种数组的初始值?
byte 型数组元素默认初始值是 0 short 型数组元素的默认初始值是 0 int 型数组元素的默认初始值是 0 long 型数组元素的默认初始值是 0L char 型数组元素的默认初始值是 .u ...
- c 初始化char**_CC++|指针详述及实例分析
指针是C语言中的精华,也是一把双刃剑,关系到安全和效率. 1 系统内存布局 2 存储变量的内存地址 3 指针定义:变量,地址,类型(宽度) 4 指针声明 5 &与*运算符 6 定义指针与解引用 ...
- C语言用char数组存储一串整数时的一个陷阱
C语言用char数组存储一串整数时的一个小陷阱 C语言的一个关于char数组的小Tip 一.问题起源 二.问题代码 三.问题分析 (一).运行分析 (二).可能的解决方案 四.问题总结(不想看长篇大论 ...
- Redis从入门到放弃系列(一) String
Redis从入门到放弃系列(一) String 本文例子基于:5.0.4 字符串是Redis中最常见的数据结构,底层是采用SDS,是可以修改的字符串,类似ArrayList,采用预分配冗余空间的方式来 ...
- shell逻辑运算符优先级_ios从入门到放弃之C基础巩固运算符
继续接着上一次ios从入门到放弃之C基础巩固-----printf函数.scanf函数.scanf函数实现原理来巩固C语言基础,这次学习的是一个非常不起眼的语言基础----运算符,这里主要是对一些比较 ...
- java char类型空值_展望Java的未来:空值类型
java char类型空值 尽管有前途的Java值类型不是迫在眉睫,但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下,以了解事情的进展情况并了解即将发生的事情. 诚然,由于 ...
- gtk学习总结:GTK从入门到放弃,三天包教包会
今天花了一些时间复习之前学习过的gtk,感觉东西光学不用忘得好快啊,在这做个之前学过的内容的备份,希望对大家有用,也希望大家不要从入门到放弃.文中有些代码例子可能来自<GTK从入门到精通> ...
- 操作系统(3) 多处理器编程:从入门到放弃
操作系统(3) 多处理器编程:从入门到放弃 入门:理解多线程 三个放弃:原子性.有序性.可见性 并发:介绍 进程与线程的区别: 进程:正在运行的程序,系统分配资源和调度的基本单位,内存中可以同时加载多 ...
最新文章
- 关于python中使用pyqt5时出现:Process finished with exit code -1073741819 (0xC0000005)
- 你必须掌握足够的知识来明确如何拥有自己的观点。同时,也要培养把自己的观点付诸现实的能力。...
- linux libbz2.so.1,libbz2.so.1.0 = not found 试过了链接和设置环境变量
- python html转换为普通文本_将HTML表转换为可读的纯文本的Python解决方案
- myeclipse实现Servlet实例(3) 通过继承HttpServlet接口实现
- springboot+1、图片上传到本地路径信息保存在数据库2、根据id删除本地图片
- 2012年波兰乌克兰欧洲杯完全赛程(06.09-07.02)
- unity 刷新layout_【Unity源码学习】Layout
- 透析BAT人工智能生态图谱:AI大战一触即发
- 送书活动还有最后一本书,怎么办呢?
- C语言输入三边求三角形面积
- qrcodejs2的错误、公众号识别不了二维码、公众号识别二维码没反应
- stm32f105vct6例程_STM32F105VCT6_USB_TEST
- java scanner的hasnext,Java Scanner hasNext()方法
- Fastadmin和Easywechat
- 牛听听 总是获取音频流出错_如果被骚扰是女人的错 | 德国2分钟讽刺短片(双语视频)...
- Linux九阴真经之无影剑残卷2(磁盘存储和文件系统)
- 利用js结合canvas给图片打马赛克
- Linux下安装网卡驱动程序详解
- 【QT】工程加载不出来,只有一个.pro文件
热门文章
- BigDecimal去除末尾多余的0
- Fragment生命周期详解
- 贪心 Codeforces Round #236 (Div. 2) A. Nuts
- 大话日志分析与管理,答题赠书活动
- 使用vSphere Host Update Utility 4.0升级ESX 3到4.0版本
- mysql数据库连接过多的错误,可能的原因分析及解决办法
- [导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性
- Vue 组件间通信方法汇总
- 如何在NEO共识节点间分配任务
- Spring框架的灵魂IOC和AOP