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吧,在铸成大错之前!

3.放弃CHAR吧,在铸成大错之前!,布布扣,bubuko.com

时间: 2024-10-13 04:43:15

3.放弃CHAR吧,在铸成大错之前!的相关文章

C++中单项链表的结点删除问题——为什么我的链表编译能过,但是运行的时候显示:*** Error in `./list': free(): invalid pointer: 0x08ba20cc *** 已放弃 (核心已转储)

1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 struct student{ 6 int my_id; 7 char name[20]; 8 int my_age; 9 int my_score; 10 student *next = nullptr; 11 student() = default; 12 student(int id,const char *n,int age,int sco

iOS 即时通讯,从入门到 “放弃”?

原文链接:http://www.jianshu.com/p/2dbb360886a8 本文会用实例的方式,将 iOS 各种 IM 的方案都简单的实现一遍.并且提供一些选型.实现细节以及优化的建议. —— 由宇朋Look分享 前言 本文会用实例的方式,将iOS各种IM的方案都简单的实现一遍.并且提供一些选型.实现细节以及优化的建议. 注:文中的所有的代码示例,在github中都有demo:iOS即时通讯,从入门到“放弃”?(demo)可以打开项目先预览效果,对照着进行阅读. 言归正传,首先我们来总

QML 从入门到放弃 第二卷

第二卷如何更快速的放弃,注重的是C++和QML的交互 <1>记事本.. (1) 先测试下不在QML创建C++对象,仅仅在main.cpp添加一个属性函数供调用. TextStreamLoader.h #ifndef TEXTSTREAMLOADER_H #define TEXTSTREAMLOADER_H #include <QObject> #include <QTextStream> #include <QDebug> class TextStreamL

2年后,还是放弃了programmer dvorak

写下此文纪念我长达两年的dvorak(以及programmer dvorak,下面都统称dvorak)的使用历程,也给想转换到dvorak的童鞋一些参考经验. 具体的开始时间记不清了,应该是大二的某个时候.那时正是喜欢折腾的时候,折腾过一众linux发行版,ubuntu,xubuntu,fedora,opensuse,还有傻傻装个puppy,做启动U盘到图书馆用那硬盘只有16G的瘦客户机,体验着残缺不全的系统,还不能上网,当时还觉的特自豪. 就是那时听说了dvorak, 这感觉就像高二的时候初识

《Java从入门到放弃》入门篇:变量

变量是什么玩意呢? 变量,顾名思义就是能变化的量 - - 好吧,举个栗子. 图片上的各种餐具,就是变量,因为同一个盘子可以在不同的时间装不同的菜,在这一桌可以装土豆肉丝,在下一桌可以装清炒黄瓜(当然,这个盘子还是要洗洗干净滴). 那么Java当中的变量有哪些要点呢,其语法是怎么样的呢? 我们来写段代码保存上面的清炒黄瓜吧··· 1 String pan9527 = "清炒黄瓜"; 这就是标准的变量的用法,其语法格式:数据类型 变量名 = 值; 三个要点: 1.数据类型 Java中的数据

android上让我放弃使用wstring来操作中英文字符串 转

android上让我放弃使用wstring来操作中英文字符串 2013-08-07 16:37:24|  分类: cocos2d|举报|字号 订阅 项目需要,需要对中英文字符串进行遍历修改等,本来wstring和string网上面有一大堆的介绍,其中有一个“跨平台”的方法,但是无奈是用到setlocale这个方法,这个方法在android(NDKR8D)上面无论如何都返回null,也可以看看其源代码(测试版本NDK R8D) google和度娘上找了我一整天,后来不得不请教himi,himi指了

C++ String 及其与char[]的比较

在学习C++之前  一般都是学过了C语言了 在C语言中   我们对字符串进行保存操作  使用的是char[] 但是在C++中    string比char[]的使用更为频繁  常见    下面稍微讲一下我对于string的认知 1.与其他的标准库类型一样   用户程序需要使用String类型对象  就必须包含相关的头文件   (为了编写方便   需要提供合适的using声明) #include <string> using std::string; 2.string对象的定义与初始化 stri

string8 string16 char*

jstring ifaceStr, jstring opPackageNameStr String16(opPackageName.c_str()),client, String8(iface.c_str()) 2.  String16 name16 = String16("HellOThEWrolD"); String8 name8 = String8(name16); 3.  string8 -> char* String8& initParam  initParam

C/C++中各种类型int、long、double、char表示范围(最大最小值)(转)

1 #include<iostream> 2 #include<string> 3 #include <limits> 4 using namespace std; 5 6 int main() 7 { 8 cout << "type: \t\t" << "************size**************"<< endl; 9 cout << "bool: \t