结论一:
在建立数据库表结构的时候,为了给一个String类型的数据定义一个数据库的数据库类型,一般参考的都是char或者varchar,这两种选择有时候让人很纠结,今天想总结一下它们两者的区别,明确一下选择塔门的理由。 首先明确的是,char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的,尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。再者,char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。
结论二:
问题1:Oracle中为什么字符串类型为varchar2,它与varchar有什么关系? 回答: 在Oracle中, varchar已经作为了保留字。如果你使用varchar类型,Oracle也不会报错,但是建表以后你会发现,已经自动变为了varchar2类型。
问题2: 用number还是用integer(整数)? 比如说number(4,3)跟(3,4)有什么区别? 还有number(3,-3) 为什么没有小数?
回答: 另外Oracle也有integer等其它类型,但是用integer有缺点,就是不知道其长度,在不同的操作系统上所分配的长度是不同的。而用number,指定多少,就永远是多少,一切掌握在自己手中。
1、number(4,3)是表示 这个数 一共有4位是有效位,后面的3 表示有3个是小数 也就是这个数 只能是1.234,这样格式的 最大只能是9.999;
2、number(3,4) 表示这个数 有效位数是3位 但是有四位小数 也就是只能是这个格式0.0123 最大只能是0.0999;
3、number(3,-3) 就是这个数有效位数一共3位,如果是正3 则是3位小数 如果是负数的话就是3 位整数 也就是123这个格式 最大只能是999;
4、还有这样的 number(2,-3) 就是这个数的有效位数是2位 但是有三位整数 所以只能是230 这样的 最大是990;
问题3: 如何为字符串和数字类型指定长度? 回答: char类型可以不指定长度,则默认为1,而varchar2必须指定长度。 char和varchar类型的长度最大长度大约在4000多一点点。 number表示不限整数或小数,它能够保存非常大的数字或者保存小数位非常多的数字。
问题4: 字符串最大长度约为4000。如果要保存更多的内容怎么办?
解决的方法有两种。第一种是用大对象类型,即CLOB或者BLOB类型,但是编程比较麻烦;第二种是用一对多的父子表实现(看例子)。 大对象是指大量的数据。如果用char或varchar2,列的最大长度大约在4000多;如果内容更多,其中一个方法就是将列设置为CLOB类型,但是只限制保存字符数据,如小说。如果是二进制数据,如图片、声音、office文档,则需要将列设置BLOB类型。CLOB或BLOB最大能够装4G的内容。如果是电影,则更通常的做法是在表中保存电影的名称、路径等信息,电影直接保存在磁盘上,而不是直接存储在数据库中,也不是用BFile类型 示例:创建小说表 create table xiao_shuo( xs_id number(10) primary key, --小说编号 xs_name varchar2(5), --小说名称 xs_contenct clob, --小说内容 xs_fen_mian blob --小说封面(图片) ); 第二种是利用父子表实现,例如:小说表(小说ID,小说标题),内容表(小说ID,行数,行内容),
主键字段类型的选择: 数据库表的主键生成机制有多种选择:Sequence、产品自增长、表自增长、UUID、复合主键。从主键单纯性和查询简单性考虑,首先不建议使用复合主键。从数据表重建和数据迁移的方便性考虑,首选UUID,但使用UUID就必须使用字符类型字段。
复合主键也叫联合主键,建议不使用联合主键,而是将唯一的,和业务无关的字段(比如mysql的自增字段)作为主键,而将业务相关的字段作为unique key,主键还是独立起来好,不要和业务撤上关系。