首页 > 代码库 > MySQL数据类型

MySQL数据类型

一、数值类型

技术分享

  1. 对于整型数据,Mysql支持在类型名称后面的小括号内指定显示宽度,如果不指定则默认为int(11),一般配合zerofill使用,数字位数不够的空间

     使用字符 “0”填满。

     字段定义示例:phone int zerofill;

  2. 如果一个列指定为zerofill,则Mysql自动为该列添加unsigned属性。。

  3. 一个表最多只能有一个auto_increment列。

  4. 定点数decimalMysql内部以字符串形式存放,比浮点数更精确。(默认整数位为10,小数位为0)。浮点数存储数据存在误差问题,浮点数的比较也有

     误差,应尽量避免,如果非要使用浮点数比较则最好使用范围比较而不要使==”比较。

  5. BIT类型用于存放位字段值。对于位字段,直接使用select命令查询将看不到结果,可以使用bin()或者hex()函数进行读取,分别将其显示为二进制和十六

     进制格式。若位数超出bit类型字段长度,则无法插入。

  6. 浮点数当插入数据的精度超过字段精度定义时,会将数据进行四舍五入后插入,该过程浮点数不会报错,但是定点数可能会进行警告然后插入,或者直

     接报错,无法插入,这取决于SQLMode

 

 

二、日期时间类型

技术分享

 

1. Mysql只给表中的第一个TIMESTAMP字段设置默认值为系统时间current_timestamp,如果有第二个TIMESTAMP类型字段,则默认值设置为0.

2. TIMESTAMP还和时区相关,当插入日期时,会先转换为本地时区后存放,而从数据库里面取出时,也同样需要将日期转换为本地时区后显示。这样,两

    个不同时区的用户看到的同一个日期可能是不一样的。

3. Mysql每种日期时间类型都有一个有效值范围,如果超出这个范围,在默认的SQLMode下,系统会提示错误,并将以零值来进行存储。

4. TIMESTAMP的取值范围为1970年到2038年的某一天,所以它不适合存放比较久远的日期。

5. TIMESTAMP的属性受Mysql版本和服务器SQLMode的影响很大。

6. 日期时间类型的使用原则:选择能够满足应用的最小存储的日期类型。

注意:

    Mysql的时间类型都不能赋值时间戳。。。而应该按YYYYMMDDHHMMSS这样的时间格式(年月日时分秒之间可以加入多种不同分隔符),或者使用Mysqlnow()等函数赋值。

 

 

三、字符串类型

技术分享

 

1. 在检索的时候,char列删除了字符串尾部的空格,而varchar则保留这些空格。binaryvarbinary类似于charvarchar,不同的是他们包含二进制字符串

   而不包含非二进制字符串。当保存binary值时,在值的最后通过填充零字节以达到指定的字段定义长度,如:在定义为binary(3)的字段中插入‘a’,

 使hex函数查看是610000.

2. 由于char是固定长度的,所以它的处理速度比varchar快得多,但其缺点是浪费存储空间,程序需要对行尾空格进行处理。对于那些长度变化不大并且对

   查询速度有较高要求的数据可以考虑使用char类型来存储。

3. MySQL 中,不同的存储引擎对CHAR VARCHAR 的使用原则有所不同:

1MyISAM 存储引擎:建议使用固定长度的数据列代替可变长度的数据列。

2MEMORY 存储引擎:目前都使用固定长度的数据行存储,因此无论使用CHARVARCHAR 列都没有关系。两者都是作为CHAR 类型处理。

(3)InnoDB 存储引擎:建议使用VARCHAR 类型。对于InnoDB 数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据

   列值的头指针),因此在本质上,使用固定长度的CHAR 列不一定比使用可变长度VARCHAR 列性能要好。因而,主要的性能因素是数据行使用的存储总

   量。由于CHAR 平均占用的空间多于VARCHAR,因此使用VARCHAR 来最小化需要处理的数据行的存储总量和磁盘I/O 是比较好的。

4. Textblob的主要区别是blob能用来保存二进制数据比如照片,而text只能保存字符数据,比如一篇文章或日记。

5. Blobtext值会引起一些性能问题,特别是在执行了大量的删除操作时,会在表中留下很大的“空洞”,以后填入这些“空洞”的记录子插入的性能上会

   有影响。为了提高性能,建议定期使用optimize table功能对这类表进行碎片整理,避免因为“空洞”导致性能问题。

   由此也可以看出:MySQL数据表删除记录之后,数据表文件大小并不会减小,记录删除的地方会留下一些空白,以后插入记录的时候就会先去填满这些空

   白。当然,可以手动使用optimize table命令去除这些空白,使数据文件变小。

6. 可以使用合成的索引来提高大文本字段的查询性能:

   简单来说,合成索引就是根据大文本字段的内容建立一个散列值(例如使用md5函数),并把这个散列值存储在单独的数据列中,接下来就可以通过检索

   散列值找到数据行了。这在一定程度上减少I/O,从而提高查询效率。但是这种技术只能用于精确匹配的查询,对于类似<>=等范围搜索操作符是没有作

   用的。如果需要对大文本字段进行模糊查询,可以只为字段的前n个字符创建索引,例如:

   Create index idx_blob on t(content(100)),其中contenttext类型字段。这样对content的前100个字符进行模糊查询就可以使用到前缀索引了,但

   是查询条件中%”不能放在最前面,否则索引将不会被使用。

7. ENUM类型是忽略大小写的。对于插入不存在ENUM指定范围内的值时,并没有返回警告(Mysql5.7插入失败),而是插入了enum中的第一个值,enum

   类型只允许从值集合中选取单个值。

8. 相比ENUMSET可以存储的成员数量比较少,而且需要的字节数比较多,但set可以一次选取多个成员。对于超出允许值范围的值不允许插入,对于

   包含重复成员的集合将只取一个。

 

MySQL数据类型