一 char和varchar有什么区别?
1.char的长度是固定的,而varchar的长度是可以变化的。
比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR2 (10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。
2. char的效率比 varchar的效率稍高,varchar2比char更节省存储空间。3.目前 varchar是 varchar2的同义词。工业标准的 varchar类型可以存储空字符串,但是Oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型 varchar2,这个类型不是一个标准的 varchar,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用 varchar2而不是 varchar。
何时该用char,何时该用varchar2?
varchar2比char节省空间,在效率上varchar2比char会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。varchar2虽然比char节省空间,但是如果一个varchar2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar2会更好一些。
char插入空值是会占用存储空间的,而varchar和varchar2不会占用空间。varchar存储空,而varchar用null表示存储空。
拓展一:oracle行链接和行迁移
行链接:通常是指在初始插入一行数据,该行数据的大小大于oracle定义的block大小的时候。oracle将使用链接一个或多个保留的block存储这一行记录。
行迁移:通常是指一行数据初始插入时候在存储在同一个block中,但是对改行数据进行修改导致原本存储的block没有足够的空间对改行数据进行存储,此时就会产生行迁移。此时oracle会将整行数据迁移到一个新的block中(假设block能够存储整行数据),oracle会原block中存储新block的指针,这就意味着行迁移之后的rowid是不会改变的。
拓展二:数据库编码格式和存储所占空间的关系
char,varchar,varchar2存储一个字符占一个字节,存放GBK编码的汉字存放2个字节,存放UTF-8编码的汉字占用3个字节;
nchar,nvarchar,nvarchar2根据所选字符集来定义存放字符的占用字节数,一般都为2个字节存放一个字符(不管字符或者汉字)。
拓展三:添加索引对insert,update,delete的性能影响
前提:先创建好了索引
insert时候会降低性能。因为在插入新的数据行之后,如果对原有索引序列产生影响,oracle会重新维护索引序列。
update更新索引列的时候会降低性能,也需要重新维护索引;更新非索引列的时候,且where条件中根据索引列检索会提高(检索提高,更新基本不会影响);更新非索引列且where条件没有根据索引列进行数据检索,不会提高。
delete删除记录时候如果where条件中根据索引列检索,删除时候会提高,否则不会提高性能。
建议:先写入数据,再创建索引。如果先创建好了索引,在写入大量数据的时候可以先使索引失效,数据插入完成之后再启用索引。虽然失效索引和启用索引也会等待,但是跟大批量写入数据维护索引比较还是会提高性能。