数据类型在所有的数据库使用当中,都是避免不了的部分。以前每次写SQL语句,对于定义成哪种数据类型总是迷迷糊糊,今天就来彻底弄清。以下介绍仅针对MySQL 5.5以上版本。

一、字符串类型

1、char和varchar

  以前在建表语句中,定义到字符串类型只会用varchar,但是它后面要指定一个数字,这个数字具体代表什么一知半解。char和varchar两个类型后面都要跟上一个数字,例如char(10),varchar(20)。

  看过官方文档后发现,这里的数字表示的是最大字符个数,注意是字符数,而不是字节数!在严格的SQL模式下,插入的字符串数据如果字符数超过这个值,分两种情况:

  ①如果尾部超出部分全都是空格,则截去超出部分后插入,产生一个警告;

  ②如果尾部超出部分含非空格字符,插入失败,直接报错。

  在非严格SQL模式下,两种情况都会直接截去超出部分后插入。

  

  括号里面的数字究竟能设为多大呢?官方说明是,char的可以设为0~255,varchar的可以设为0~65535。对于char没有任何问题,但对于varchar,经过实际操作发现没那么简单。

  MySQL不管对于什么样的存储引擎,有一个统一的设定,那就是一行数据的总字节数,不能超过65535。而字符有英文字符,有中文字符,还有其他语言的字符,而且各种编码下,有的字符一个占1字节,有的字符一个占2个或3个字节。而MySQL的默认编码类型是utf-8,一个中文字符占到3个字节,如果某个字段指定为varchar(65535),那么单这一个字段,最大字节数就可能达到65535*3,远远超出了一行数据的最大设定65535字节。比如执行如下语句:

create table t_planet
(
name varchar(65535)
);

会提示如下错误: create table t_planet ( name varchar(65535) ) Error Code: 1074. Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead

注意这里的错误提示,它提示name字段的最大字符数只能为21845,也就是65535除以3。因为在默认的utf-8编码下,最坏情况下会出现全为中文字符的情况,根据一个中文字符占3字节,所以最大字符数就是65535/3。

如果把字符集改为所有字符只占1字节的latin1,字符数最大值就可以达到65535了。

create table t_planet
(
name varchar(65535)
) character set latin1;  //整张表格的字符集指定为latin1

  以上只是对最大字符数做的设定。具体到一个字符串究竟占用了多少字节,char和varchar的计算方法不一样。首先当然要根据实际的字符集,算出各个字符各自占用的字节数,然后求和。这里为了方便起见,假定每个字符都占一个字节。这样,对于char(M),实际占用的字节数就永远都是M,因为如果字符数不满M,后面用空格补充,空格也占用字节数。当然这是存储时的情况,select显示时是把尾部空格全部去掉的。

  而对于varchar(M),实际占用的字节数绝大多数小于M,输入几个字符就是几个字符,不会自动填充。当然,因为字符数不确定,就要额外增加1到2个字节记录字符个数,<=255个字符用1字节记录,>255&&<=65535个字符就用2字节记录。这样,一个varchar(M)的字符串,实际占用空间大小就是“实际字符数+1或+2”。

  由上面分析可以得知,varchar表面上完全可以取代char,实际未必,因为varchar有额外的空间占用。更重要的是,在以字符串创建索引、进行排序等操作时,由于char的字符数固定,拥有更高的效率。比方说有一个学号字段,有9位数也有10位数,表面上应该用可变字符串varchar,实际上用固定字符串char(10)是更好的选择。

2、enum

  enum可以理解为枚举类型,它给出n个现成的字符串,插入的数据只能从这几个字符串里面选择。

create table country
(
place enum('Japan','China','Russia','Brazil','America')
); insert into country values ('China');

插入数据的语句跟正常的一样。一旦插入的字符串不在范围里面,如果处于严格的SQL模式,会直接报错,插入失败;否则会插入空字符串('')。当然也可以插入null。

如果enum限定为not null,默认值就是第一个字符串,否则就是null。

使用enum类型除了可以限定插入的具体值以外,还有很重要的一点就是节省空间。如上例插入'China'的时候,实际上并没有插入5个字节的字符,而是仅插入一个字节的数组索引,这个索引是2,指向第二个字符串,而不是额外为字符开辟存储空间。记录达到成千上万的时候,能节省多少空间可想而知。

另外,建议枚举值不要用'1','2','3'这样的数值型表示,MySQL对这种形式处理起来往往会出现意想不到的结果。

二、整数类型

  MySQL中的整数类型使用起来很简单,样式就是:INT [UNSIGNED] [ZEROFILL]。其中第一个参数是类型名,可以是其他的int型;第二个参数指明是否带符号整数,默认含负数范围,指定为unsigned后只能为正数或0,可以使正数范围扩大一倍;第三个参数指明数字前是否以0填充,以使该字段所有数据位数一致。

  MySQL中整数类型众多,其中INT和SMALLINT是SQL语言的标准类型,其他是MySQL的补充类型。

三、小数类型

  浮点数:float和double,跟编程语言里面的单双精度一样。

  float占4字节,表示范围:负数部分-3.402823466E+38 到 -1.75494351E-38,正数部分与之对称 1.75494351E-38 到 3.402823466E+38

  double占8字节,因为平时极少涉及很高的精度,此处略。

  float和double都可以定制符合自己要求的位数,格式float(M,D),其中M表示整数和小数部分所有数字的个数最大值,D表示小数点后的小数位数。实际应用中,一旦设定,小数部分必须达到D位,不足补0,超出四舍五入;整数部分最多只能为M-D位。

  注意在用==或!=比较时会产生误差,比较结果往往不确定。

  未完待续。。。

MySQL学习笔记之数据类型的更多相关文章

  1. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

  2. Mysql学习笔记(一)数据类型

    原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m ...

  3. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  4. 初识mysql学习笔记

    使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...

  5. MySQL学习笔记-大纲

    软件程序性能测试在之前<品味性能之道>系列中已经大量提到,讲解了很多测试方法.测试观念.测试思想等等.最近准备深入MySQL进行学习并总结.分别查阅<MySQL性能调优与架构设计&g ...

  6. 【mysql学习笔记整理】

    /*mysql学习笔记整理*/ /*常用的数据库操作对象*/ #库的操作#创建#数据库的创建USE mysql;CREATE DATABASE db_x;#删除#删除数据库DROP DATABASE ...

  7. MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  8. 一千行MySQL学习笔记 (转)

    出处:  一千行MySQL学习笔记 /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权 ...

  9. mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

随机推荐

  1. 延时调用--deferred.js原码分析

    有些时候,我们需要等待上一个操作完成之后,才能进行下一步的操作.比如Ajax实现自动提交表单操作的时候,程序需要等待,一旦有返回结果了,则继续进行一下步操作. 这时deferred.js这个库就产生了 ...

  2. MySQL的分页优化

    今天下午,帮同事重写了一个MySQL SQL语句,该SQL语句涉及两张表,其中一张表是字典表(需返回一个字段),另一张表是业务表(本身就有150个字段,需全部返回),当然,字段的个数是否合理在这里不予 ...

  3. 如何用Perl截取报文

    在实际生产环境中,常常需要从后台日志中截取报文,报文的形式类似于 <InterBOSS> ... ... ... </InterBOSS> 一个后台日志有多个报文,每个报文可由 ...

  4. 小菜学习Winform(二)WMPLib实现音乐播放器

    前言 现在网上有很多的音乐播放器,但好像都不是.net平台做的,在.net中实现音乐文件的播放功能很简单,下面就简单实现下. SoundPlayer类 在.net提供了音乐文件的类:SoundPlay ...

  5. 如何在Windows Server 2008 上添加RD (远程桌面)会话主机配置的远程桌面授权服务器

    在Windows Server系列的现存活跃产品中都默认的会开放两个随机附送的远程控制的授权,而一些特殊条件下我们需要启用多个远程终端连接,在购买了相应的授权之后,我们如何将配置好的服务器添加到远程桌 ...

  6. 自己使用的一个.NET轻量开发结构

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABFCAIAAAAerjlvAAAE2UlEQVR4nO2a3U/bVhiH+bdyPaqpmx

  7. AngularJS源码分析之依赖注入$injector

    开篇 随着javaEE的spring框架的兴起,依赖注入(IoC)的概念彻底深入人心,它彻底改变了我们的编码模式和思维.在IoC之前,我们在程序中需要创建一个对象很简单也很直接,就是在代码中new O ...

  8. 1.Java网络编程之概述

    黑马程序员_毕向东_Java基础视频教程第23天-01-网络编程(概述)学习笔记 网络通讯三要素: 1.IP地址 I.网络中设备的标识  II.不易记忆,可用主机名 www 万维网组织,baidu主机 ...

  9. Nancy之Forms authentication的简单使用

    一.前言 想必大家或多或少都听过微软推出的ASP.NET Identity技术,可以简单的认为就是一种授权的实现 很巧的是,Nancy中也有与之相类似的技术Authentication,这两者之间都用 ...

  10. membership与成员资格

    membership成员资格是ASP.NET 成员资格为您提供了一种验证和存储用户凭据的内置方法.因此,ASP.NET 成员资格可帮助您管理网站中的用户身份验证.它包含以下功能 创建新用户和密码. 将 ...