Mysql知识回顾

http://www.educity.cn/wenda/596225.html

http://blog.csdn.net/dyllove98/article/details/9289483

http://opsmysql.blog.51cto.com/2238445/1343771

http://www.cnblogs.com/lyhabc/p/3886402.html

Int(11)详解

int(11)最大长度是多少

  在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度。

  这个11代表显示宽度,整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节。

  int是整型,(11)是指显示字符的长度,但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001 ~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0

  声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL会为它指定一个默认值。显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是 INT整型所允许的最大值。

  MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。它们之间的区别是取值范围不同,存储空间也各不相同。

在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。

  int范围

Type Bytes Minimum Value Maximum Value

(Signed/Unsigned) (Signed/Unsigned)

TINYINT 1 -128 127

0 255

SMALLINT 2 -32768 32767

0 65535

MEDIUMINT 3 -8388608  8388607

0 16777215

INT 4 -2147483648 2147483647

0 4294967295

BIGINT 8 -9223372036854775808    9223372036854775807

0 18446744073709551615

zerofill实例

Int(3)在指定Zerofill的时候表示,查询结果不足3位会进行0填充,确保占用3个字符。但是超过3位的原样输出。

例如

mysql> create table tb1(a int(3) zerofill);

Query OK, 0 rows affected (0.02 sec)

mysql> insert into tb1 values(1),(1234);

Query OK, 1 row affected (0.01 sec)

mysql> select * from tb1;

+-------+

| a     |

+-------+

|  001|

| 1234 |

+-------+

1 row in set (0.00 sec)

MySQL中varchar(n)的最大长度

MySQL版本决定的varchar存储规则

(1) 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)

(2) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个。

后面我们只研究5.0版本以上的mysql中varchar(n)里面与n的大小有关的内容。

字符&字节

字母,汉字都是字符,字符就会有对应的编码,编码方式决定存储空间(字节)的大小。

比如,字符类型若为gbk,每个字符最多占2个字节;字符类型若为utf8,每个字符最多占3个字节。

对于非常特殊的汉字来讲,gbk汉字占用2个字节,utf8汉字占用3个字节。

而Gbk和utf8数字、字母都占用1个字节。

Char_length & byte_length

对于Varchar(n)来讲:

Char_length 【n】:字符长度(个数),不管是字母,汉字都是一个字符;

Byte_length:存储空间(字节数),跟字符编码有关系,比如UTF8汉字占用3个字节的存储空间;

比如utf8编码的‘周一001’的char_length是5,但是byte_length是9;

Char(n)和Varchar(n)

Char(n),其中n<=255,如果字符数<n,那么在内容右边填充空格,确保字符数量为n;在进行select查询时,结果最后的空格会被去除掉。CHAR存储定长数据很方便,CHAR字段上的索引效率级高。

比如定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

VARCHAR(n)定义的列的长度为可变长字符串,n<65535(n的最大有效长度由最大行大小其他字段的长度,以及使用的字符集确定)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有 CHAR高。

如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。

从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录字符串长度的1或者2个字节(如果超过255则需要两个字节)。

如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。

规则限制

首先我们要知道,存储的最大长度(char_length)没一个固定的数值,根据不同的表结构设计有所不同,一般有以下几个限制规则:

1)行长度限制

  导致实际应用中varchar长度限制的是一个行定义的长度。MySQL要求一个行的定义长度不能超过65535字节(64k)。若定义的表长度超过这个值,则提示

  ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

总结一下 byte_length(row) <=65535

2)存储限制

varchar内容的存储格式为:

1或2个字节存储长度+数据内容

开始的1到2个字节表示实际长度(长度超过255时需要2个字节),之后才存储真正的数据内容。

总结:max_char_length<=65536-1-2

第一个减1是因为实际行存储从第二个字节开始。

3)编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

max_char_length(gbk)<=(65536-1-2)/2=32766

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21844。

max_char_length(utf8)<=(65536-1-2)/3=21844

 

减1的原因是实际行存储从第二个字节开始;

减2的原因是varchar头部的2个字节表示长度;

除3的原因是字符编码是utf8.

Varchar转Text的条件

原则:

单行所有字段的总长度row_length<=65535;

如果单个字段varchar(n)所占用的空间>65535,则自动转为text类型。

如果一个表格只有一个varchar(n)字段,编码为utf8或者gbk;

Utf8的时候,

N

Varchar(n)_length

Row_length

Result

21844

21844*3=65532

65532+3=65535

刚好可以创建成功,类型为varchar

21845

21845*3=65535

65535+3>65535

创建失败

21846

21846*3=65538>65535

varchar转换为text类型,创建成功

也就是说utf8的时候,N>=21846,varchar(n)单个字段超过了65535,那么会转换为text类型,因此创建成功。

gbk的时候:

N

Varchar(n)_length

Row_length

Result

32766

32766*2=65532

65532+3=65535

刚好可以创建成功,类型为varchar

32767

32767*2=65534<65535

65534+3>65535

创建失败

32768

32768*2=65536>65535

varchar转换为text类型,创建成功

也就是说gbk的时候,N>=32768,varchar(n)单个字段超过了65535,那么会转换为text类型,因此创建成功。

Varchar(n)实例

l 实例一

若一张表中只有一个字段VARCHAR(N)类型,utf8编码或者gbk编码,则N最大值为多少?

ü Utf8编码

create table tb_name1(a varchar(N)) default charset=utf8;

则:N最大值=(65535-1-2)/3=21844

减1的原因是实际行存储从第二个字节开始;

减2的原因是varchar头部的2个字节表示长度;

除3的原因是字符编码是utf8.

mysql测试如下:

mysql> create table tb_name1(a varchar(21844)) default charset=utf8;

Query OK, 0 rows affected (0.01 sec)

mysql> drop table tb_name1;

Query OK, 0 rows affected (0.01 sec)

mysql> create table tb_name1(a varchar(21845)) default charset=utf8;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

mysql>

mysql> create table tb_name1(a varchar(21846)) default charset=utf8;

Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show warnings;

+-------+------+--------------------------------------------+

| Level | Code | Message                                    |

+-------+------+--------------------------------------------+

| Note  | 1246 | Converting column 'a' from VARCHAR to TEXT |

+-------+------+--------------------------------------------+

1 row in set (0.00 sec)

ü gbk编码

mysql> create table tb_name1(a varchar(32766)) default charset=gbk;

Query OK, 0 rows affected (0.03 sec)

mysql> drop table tb_name1;

Query OK, 0 rows affected (0.01 sec)

mysql> create table tb_name1(a varchar(32767)) default charset=gbk;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

mysql>

mysql> create table tb_name1(a varchar(32768)) default charset=gbk;

Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show warnings;

+-------+------+--------------------------------------------+

| Level | Code | Message                                    |

+-------+------+--------------------------------------------+

| Note  | 1246 | Converting column 'a' from VARCHAR to TEXT |

+-------+------+--------------------------------------------+

1 row in set (0.00 sec)

l 实例二

若一张表中有一个字段VARCHAR(N)类型,并且有其它的字段类型,utf8编码,则N的最大值为多少?

如:create table tb_name2(a int, b char(20), c varchar(N)) default charset=utf8;

则:N最大值=(65535-1-2-4-20*3)/3=21822

减1的原因是实际行存储从第二个字节开始;

减2的原因是varchar头部的2个字节表示长度;

减4的原因是a字段的int类型占4个字节;

减20*3的原因是char(20)占用60个字节,编码是utf8。

Char(20)在utf8编码下占据60个字节。

回到sql下测试下:

MariaDB [opdba]> create table tb_name2(a int, b char(20), c varchar(21822)) default charset=utf8;

Query OK, 0 rows affected (0.28 sec)

mysql> drop table tb_name2;

Query OK, 0 rows affected (0.20 sec)

mysql> create table tb_name2(a int, b char(20), c varchar(21823)) default charset=utf8;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

mysql> create table tb_name2(a int, b char(20), c varchar(21846)) default charset=utf8;

Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show warnings;

+-------+------+--------------------------------------------+

| Level | Code | Message                                    |

+-------+------+--------------------------------------------+

| Note  | 1246 | Converting column 'c' from VARCHAR to TEXT |

+-------+------+--------------------------------------------+

1 row in set (0.00 sec)

l 实例三

若一张表中有多字段VARCHAR(N)类型,并且有其它的字段类型,gbk编码,则N的最大值为多少?

如:create table tb_name3(a int, b char(20), c varchar(50), d varchar(N)) default charset=gbk;

则:N最大值=(65535-1-4-20*2-1-50*2-2)/2=32693

第一个减1的原因是实际行存储从第二个字节开始;

减去4的原因是int占用4个字节;

减20*2的原因是char(20)占用40个字节,编码是gbk;

第二个减1表示varchar(50)头部一个1个字节表示长度(小于255);

减50*2的原因是varchar(50)占用100个字节,编码是gbk;

减2的原因是varchar(N)头部的2个字节表示长度(大于255);

回到SQL测试:

mysql> create table tb_name3(a int, b char(20), c varchar(50), d varchar(32693)) default charset=gbk;

Query OK, 0 rows affected (0.18 sec)

mysql> create table tb_name3(a int, b char(20), c varchar(50), d varchar(32694)) default charset=gbk;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

l 实例四

若一张表中有多字段VARCHAR(N)类型,并且有其它的字段类型,utf8编码,则N的最大值为多少?

如:create table tb_name3(a int, b char(20), c varchar(50), d varchar(N)) default charset=utf8;

则:N最大值=(65535-1-4-20*3-1-50*3-2)/3=21772

第一个减1的原因是实际行存储从第二个字节开始;

减去4的原因是int占用4个字节;

减20*3的原因是char(20)占用60个字节,编码是utf8;

第二个减1表示varchar(50)头部一个1个字节表示长度(小于255);

减50*3的原因是varchar(50)占用150个字节,编码是utf8;

减2的原因是varchar(N)头部的2个字节表示长度(大于255);

回到SQL测试:

MariaDB [opdba]> create table tb_name4(a int, b char(20), c varchar(50), d varchar(21772)) default charset=utf8;

Query OK, 0 rows affected (0.18 sec)

MariaDB [opdba]> create table tb_name4(a int, b char(20), c varchar(50), d varchar(21773)) default charset=utf8;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

Char(n)实例

Char(n)中n的最大长度是255

mysql> create table tb_name5(a char(255)) default charset=utf8;

Query OK, 0 rows affected (0.02 sec)

mysql> drop table tb_name5;

Query OK, 0 rows affected (0.00 sec)

mysql> create table tb_name5(a char(256)) default charset=utf8;

ERROR 1074 (42000): Column length too big for column 'a' (max = 255); use BLOB or TEXT instead

Blob和Text

BLOB 存储可变长度的二进制数据,比如图片数据;

TEXT只能储存纯可变长度的文本数据。

mysql基础类型知识总结的更多相关文章

  1. mysql基础指令知识

    桌面指令(cmd)进入mysql客户端 第一步:安装mysql,配置环境变量 第二步:手动开启服务 第三步:输入如下指令: mysql [-h localhost -P 3306] -u  用户名 - ...

  2. MySQL基础知识

    一.MySQL安装 MySQL的下载 http://dev.mysql.com/downloads/mysql/ MySQL版本选择 MySQL功能自定义选择安装 1.功能自定义选择 2.路径自定义选 ...

  3. Mysql基础之 基础知识解释

    Mysql基础知识 RDBMS:关系型数据库管理系统.是将数据组织成相关的行和列的系统 存储过程:是存储在数据库中的一段声明性语句.触发器.java.php等都可以调用其存储过程.早期的mysql版本 ...

  4. mysql基础知识大全

    前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里作简单概括性的介绍,具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续会慢慢补充完善. 数据库和数据库软件 数据库是 ...

  5. mysql基础知识语法汇总整理(一)

    mysql基础知识语法汇总整理(二)   连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...

  6. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

  7. mysql基础知识扫盲

    本篇主要介绍关于mysql的一些非常基础的知识,为后面的sql优化做准备. 一:连接mysql 关于mysql的下载和安装我在这里就不说了,第一步我们要连接我们的mysql服务器,打开cmd命令切换到 ...

  8. 数据库 MySQL基础知识

    (关于MySQL的安装,具体见下面博客:http://www.cnblogs.com/wj-1314/p/7573242.html) 一.什么是数据库 ? 数据库是按照数据结构来组织,存储和管理数据的 ...

  9. { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型

    MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...

随机推荐

  1. windows多线程编程

    进程共同实现某个任务或者共享计算机资源, 它们之间存在两种关系: 1.同步关系, 指为了完成任务的进程之间, 因为需要在某些位置协调它们的执行顺序而等待, 传递消息产生的制约关系. 2.互斥关系, 进 ...

  2. CSS选 择器 三种样式

    一.CSS三种样式 代码 宽度 高度 实线 颜色  A内联样式是优先级最高的方式 px必须写 A:内联式  弊端:代码多很乱 <body> <div class="divc ...

  3. C#窗体程序【用户控件-窗体】委托事件

    这里的自定义控件是由普通控件组合而成的.希望事件响应代码推迟到使用自定义控件的窗体里写.步骤一:新建一个用户控件,放两个按钮,Tag分别是btn1,btn2.这两个按钮的共用单击事件处理代码如下: u ...

  4. py-faster-rcnn搭配pycharm使用

    先在ubuntu下配置好cuda.cudnn以及py-faster-rcnn,然后安装pycharm. 打开pycharm看py-faster-rcnn代码,import处各种红色下划曲线,提示报错. ...

  5. 【总结】.Net面试题集锦(一)

    一.背景 最近一直在准备面试,收到的面试邀请邮件里还有面试题,真是要当面霸的节奏,不过看看也好,一方面能够锻炼锻炼生锈的脑子,查缺补漏一下,另一方面,万一靠这几个面试题拿到offer呢,哈哈.开个玩笑 ...

  6. prefix pct文件配置Xcode

    1.查看项目的各个文件夹下的文件名称: 2.配置如下图:需要添加$(SRCROOT)/项目的名称/pch所在文件夹路径 .易于理解方便那些初学者,下载别人的demO运行时遇到这样的类似的问题噢.< ...

  7. cookie---session

    //以下文字摘自慕课网教程..... 设置cookie PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个: name( Coo ...

  8. Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。

    ######Nginx配置文件nginx.conf中文详解######定义Nginx运行的用户和用户组user www www;#nginx进程数,建议设置为等于CPU总核心数.worker_proc ...

  9. Solved: “Cannot execute a program. The command being executed was \roslyn\csc.exe”

    When you publish your ASP.NET project to a hosting account such as GoDaddy, you may run into the iss ...

  10. Dota2 demo手游项目历程

    最近其实是打算认真研究c++ primer和设计模式的原著,然后写一些读书笔记的,不过设计模式原著里生词太多,大多都看的不是很明白,因此暂时放弃阅读设计模式,打算用这些时间做一个类似我叫mt2的手游d ...