/*************************************************
三、主题:放弃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吧,在铸成大错之前!相关推荐

  1. 【C++标准库】std::string用法指南源码剖析

    文章目录 1.ASCII码 (1)计算机如何表达字符 2.C 语言中的字符类型 char (1)思想:char 即整数 (3)C 语言帮手函数 (4)C语言中的字符串 (4)C 语言转义符 3.C++ ...

  2. char的初始值_java从入门到放弃 各种数组的初始值?

    byte 型数组元素默认初始值是 0 short 型数组元素的默认初始值是 0 int 型数组元素的默认初始值是 0 long 型数组元素的默认初始值是 0L char 型数组元素的默认初始值是 .u ...

  3. c 初始化char**_CC++|指针详述及实例分析

    指针是C语言中的精华,也是一把双刃剑,关系到安全和效率. 1 系统内存布局 2 存储变量的内存地址 3 指针定义:变量,地址,类型(宽度) 4 指针声明 5 &与*运算符 6 定义指针与解引用 ...

  4. C语言用char数组存储一串整数时的一个陷阱

    C语言用char数组存储一串整数时的一个小陷阱 C语言的一个关于char数组的小Tip 一.问题起源 二.问题代码 三.问题分析 (一).运行分析 (二).可能的解决方案 四.问题总结(不想看长篇大论 ...

  5. Redis从入门到放弃系列(一) String

    Redis从入门到放弃系列(一) String 本文例子基于:5.0.4 字符串是Redis中最常见的数据结构,底层是采用SDS,是可以修改的字符串,类似ArrayList,采用预分配冗余空间的方式来 ...

  6. shell逻辑运算符优先级_ios从入门到放弃之C基础巩固运算符

    继续接着上一次ios从入门到放弃之C基础巩固-----printf函数.scanf函数.scanf函数实现原理来巩固C语言基础,这次学习的是一个非常不起眼的语言基础----运算符,这里主要是对一些比较 ...

  7. java char类型空值_展望Java的未来:空值类型

    java char类型空值 尽管有前途的Java值类型不是迫在眉睫,但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下,以了解事情的进展情况并了解即将发生的事情. 诚然,由于 ...

  8. gtk学习总结:GTK从入门到放弃,三天包教包会

    今天花了一些时间复习之前学习过的gtk,感觉东西光学不用忘得好快啊,在这做个之前学过的内容的备份,希望对大家有用,也希望大家不要从入门到放弃.文中有些代码例子可能来自<GTK从入门到精通> ...

  9. 操作系统(3) 多处理器编程:从入门到放弃

    操作系统(3) 多处理器编程:从入门到放弃 入门:理解多线程 三个放弃:原子性.有序性.可见性 并发:介绍 进程与线程的区别: 进程:正在运行的程序,系统分配资源和调度的基本单位,内存中可以同时加载多 ...

最新文章

  1. 关于python中使用pyqt5时出现:Process finished with exit code -1073741819 (0xC0000005)
  2. 你必须掌握足够的知识来明确如何拥有自己的观点。同时,也要培养把自己的观点付诸现实的能力。...
  3. linux libbz2.so.1,libbz2.so.1.0 = not found 试过了链接和设置环境变量
  4. python html转换为普通文本_将HTML表转换为可读的纯文本的Python解决方案
  5. myeclipse实现Servlet实例(3) 通过继承HttpServlet接口实现
  6. springboot+1、图片上传到本地路径信息保存在数据库2、根据id删除本地图片
  7. 2012年波兰乌克兰欧洲杯完全赛程(06.09-07.02)
  8. unity 刷新layout_【Unity源码学习】Layout
  9. 透析BAT人工智能生态图谱:AI大战一触即发
  10. 送书活动还有最后一本书,怎么办呢?
  11. C语言输入三边求三角形面积
  12. qrcodejs2的错误、公众号识别不了二维码、公众号识别二维码没反应
  13. stm32f105vct6例程_STM32F105VCT6_USB_TEST
  14. java scanner的hasnext,Java Scanner hasNext()方法
  15. Fastadmin和Easywechat
  16. 牛听听 总是获取音频流出错_如果被骚扰是女人的错 | 德国2分钟讽刺短片(双语视频)...
  17. Linux九阴真经之无影剑残卷2(磁盘存储和文件系统)
  18. 利用js结合canvas给图片打马赛克
  19. Linux下安装网卡驱动程序详解
  20. 【QT】工程加载不出来,只有一个.pro文件

热门文章

  1. BigDecimal去除末尾多余的0
  2. Fragment生命周期详解
  3. 贪心 Codeforces Round #236 (Div. 2) A. Nuts
  4. 大话日志分析与管理,答题赠书活动
  5. 使用vSphere Host Update Utility 4.0升级ESX 3到4.0版本
  6. mysql数据库连接过多的错误,可能的原因分析及解决办法
  7. [导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性
  8. Vue 组件间通信方法汇总
  9. 如何在NEO共识节点间分配任务
  10. Spring框架的灵魂IOC和AOP