原文在我的Github上,欢迎订阅。前言本文延续上一篇Mysql入门课《建表、改表、删表》继续学习。要构建一个优秀的表,选择合适的数据类型非常重要。如果数据类型选择不当,不仅会在开发时给自己带来麻烦,还会导致数据库性能低下。比如给student(student表)增加一个age字段,选择TINYINT类型就可以了,它的范围是0-255(无符号),比较合适。如果使用INT,也可以满足条件,但是INT占用4个字节,而TINYINT只占用1个字节,相比TINYINT,性能当然要好一些。刚才提到了UNSIGNED(无符号),下面我来解释一下。数据类型Mysql支持多种类型,大致分为三类:数值型、字符串型和日期/时间型。我们每个breaknumerictypetypesizerange(signed)range(unsigned)usesTINYINT1byte(-128,127)(0,255)smallIntegervalueSMALLINT2byte(-32768,32767)(0,65535)largeIntegervalueMEDIUMINT3bytes(-8388608,8388607)(0,16777215)大整数值INT或INTEGER4字节(-2147483648,2147483647)(0,4294967295)大整数值BIGINT8字节(-9,223,372,036,854,775,808,9223372036854775807)(0,18446744073709551615)非常大的整数值FLOAT4字节(-3.402823566E+38,-14E.17,-18),75494351E-38,3.402823466351E+38)0,(1.175494351E-38,3.402823466E+38)单精度浮点值DOUBLE8字节(-1.7976931348623157E+308,-2.2250738585072014E-308),0,(2.2250738585072014E-308,1.7976931348623157E+308)0,(2.225875072014E-308,46.79178623157E+308)双精度浮点值DECIMALtoDECIMAL(M,D),ifM>D,M+2elseD+2dependsonMandD该值取决于M和D的值这里的decimalvalue对上面说的signed和unsigned做了解释:signed:默认是signed,其实就是负数到正数的取值范围unsigned(UNSIGNED):没有负数,最小从0开始正常开发,从整数类型到INT的取值范围已经很大了。建表时,经常会看到INT(5)后面有个5,表示显示宽度(M),M的值不能大于取值范围的长度。例如:年龄字段类型为INT(5)UNSIGNEDZEROFILL,插入一条年龄为99的数据,最后显示:00099UNSIGNED是无符号的,ZEROFILL的作用是将没有数字的位置补上0。我问过一些同事,很多字段在开发的时候为了方便应该使用数值类型,他们选择使用字符串类型。看这句话,建表最常用的是string类型,看看它有哪些类型:typesizeuseCHAR0-255bytesfixed-lengthstringVARCHAR0-65535bytesvariablelengthStringTINYBLOB0-255bytesBinarystringof不超过255个字符TINYTEXT0-255字节短文本字符串BLOB0-65535字节二进制形式的长文本数据TEXT0-65535字节长文本数据MEDIUMBLOB0-16777215字节二进制形式的中等长度文本数据MEDIUMTEXT0-16777215字节的中等长度文本数据LONGBLOB0-4294967295字节的二进制形式的超大文本数据LONGTEXT0-4294967295字节的超大文本数据一般情况下很少使用二进制数据。通常,图像和音频存储在CDN或云服务器中。CHAR、VARCHAR和TEXT更常用。光看表没什么概念,但是我们可以知道字符串的大小主要是用字节来表示的。我们开发中使用的字符串一般都是英文字母和汉字,所以我们需要知道字节和它们的关系:Mysql底层UTF8编码:1个英文字母(包括大小写)占1个字节,1个汉字占3个字节字节。所以我们在保存姓名、介绍、文章的时候,可以根据占用的字节数来选择合适的类型,完美。日期/时间类型这种类型我们也用的比较多,比如生日、创建时间、修改时间等都需要。typesizerangeformatusageDATE3bytes1000-01-01/9999-12-31YYYY-MM-DD日期值TIME3bytes'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间YEAR1字节1901/2155YYYY年值DATETIME8字节1000-01-0100:00:00/9999-12-3123:59:59YYYY-MM-DDHH:MM:SS混合日期和时间值TIMESTAMP4字节1970-01-0100:00:00/2038(结束时间为2147483647秒,北京时间2038-1-1911:14:07,GMT03:14:07onJanuary19,2038)YYYYMMDDHHMMSS混合日期时间值,时间stamp在开发中常用,DATETIME和TIMESTAMP也用来记录时间,下面从可读性、存储空间、可操作性分析:不如DATETIME和TIMESTAMP直观。对于存储空间,INT和TIMESTAMP的最小大小为4字节,DATETIME占用8字节。可操作性,在平时,我们有读取、写入、比较、计算日期。每个人读和写都一样,没有区别;在比较和计算方面,INT要方便很多,可以直接进行比较、加减等操作。另外两个需要使用代码工具进行计算比较。这时候表现最好的就是INT合成了,考虑到我个人比较喜欢TIMESTAMP,占用空间小,可读性更好。如果对性能要求不高的话,借助代码操作起来也很简单,但是使用时要考虑它的时间范围!结合Mysql入门第一课《建表、改表、删表》和这篇文章,有几个约束条件。这里有必要说一下:UNSIGNED:无符号,值从0开始,没有负数ZEROFILL:零填充,当数据显示长度不够时,可以使用前导0的效果来填充到指定长度,字段会自动加上UNSIGNEDNOTNULL:非空约束,表示字段的值不能为空valuePRIMARYKEY:主键约束,表示唯一标识,不能为空,一张表只能有一个主键。一般用于约束idAUTO_INCREMENT:自增长,只能用于数值列,与索引一起使用。默认起始值??从1开始,每次递增1。UNIQUEKEY:唯一值,表示该字段下的值不能重复,null除外。比如身份证号是一人一号,一般用FOREIGNKEY来约束:外键约束,目的是保证数据的完整性和唯一性,实现一对一或一对一-对多关系。介绍数据类型以及在开发中如何使用合适的数据类型,然后介绍额外剧集中建下表时出现的条件约束。下一篇文章将开始Mysql入门第3课《数据的增删改》欢迎阅读。
