您所在的位置:首页 > 新闻中心 > MySQL基础知识01数据类型,MySQL中CHAR和VARCHAR类型演变和详解【澳门新濠登录网址】
公司要闻
MySQL基础知识01数据类型,MySQL中CHAR和VARCHAR类型演变和详解【澳门新濠登录网址】
发布时间:2020-03-18 22:31
访问量:359

浮点数与确定地点数

为了能够引起大家的垂青,在介绍浮点数与定点数早先先让大家看叁个例证:
mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
Query OK, 0 rows affected (0.29 sec)

mysql> insert into test values(131072.32,131072.32);
Query OK, 1 row affected (0.07 sec)

mysql> select * from test;
+-----------+-----------+
| c1        | c2        |
+-----------+-----------+
| 131072.31 | 131072.32 |
+-----------+-----------+
1 row in set (0.00 sec)

从地点的例证中咱们见到c1列的值由131072.32形成了131072.31,那正是浮点数的不许确性产生的。

在mysql中float、double(或real)是浮点数,decimal(或numberic)是定点数。

浮点数相对于定点数的亮点是在尺寸一定的图景下,浮点数能够代表越来越大的数量范围;它的劣点是会引起精度难点。在事后有关浮点数和定点数的使用中,大家要深深记住以下几点:

  1. 浮点数存在抽样误差难题;
  2. 对货币等对精度敏感的数目,应该用定点数表示或存款和储蓄;
  3. 编制程序中,假使用到浮点数,要极度注意引用误差难点,并尽量防止做浮点数对比;
  4. 要注意浮点数中有的特殊值的拍卖。

 

ref:

字符串类型

  有三种为主的串类型,分别为定长串,变长串。CHA奥迪Q5归于顶长性,VARCHA瑞虎、BLOB和TEXT类是变长类型。种种门类的囤积供给在于列值的其实尺寸(用前面包车型大巴表中的L意味着卡塔尔国,并非该品种的最大恐怕的高低。比方,VARCHA昂Cora(10卡塔尔(قطر‎列能够包容最大尺寸为10的字符串。实际存款和储蓄须求是字符串(L卡塔尔国的长短,加上多个记录字符串长度的字节。对于字符串'abcd',L是4,存款和储蓄要求5个字节。关于字符串类型的详实表达请看:上面重点相比VARCHAMurano和CHADisco Volante。

CHAR: 采纳长度固定的字符串,长度在创造表时钦命。char不允超多于钦定的字符数目,分配的半空11月钦赐的同等多。

VARCHA: 唯有钦定的多少得到保留(额外的多寡不保留)。varchar能够钦点最大尺寸。 

双方分别:

  1. 仓库储存长度差异。
  2. 拍卖char的进程比varchar快得多。
  3. MySql差别意对varchar举办索引。
  4. char的尾巴部分空格不保留,就是截断。
  5. 同CHAHighlander相比较,VARCHA奥迪Q5值保存时只保留必要的字符数,另加二个字节来记录长度(假使列声明的尺寸超过255,则运用七个字节卡塔尔国。

 

CHAR(4)

存储需求

VARCHAR(4)

存储需求

''

'    '

4个字节

''

1个字节

'ab'

'ab  '

4个字节

'ab '

3个字节

'abcd'

'abcd'

4个字节

'abcd'

5个字节

'abcdefgh'

'abcd'

4个字节

'abcd'

5个字节

 

  下边有四个事例,能够表达后面部分阶段的标题:
mysql> create table vc (v varchar(4),c char(4));

mysql> insert into vc values ('ab ','ab ');

mysql> select concat(v,'+'),concat(c,'+') from vc;
+---------------+---------------+
| concat(v,'+')   | concat(c,'+')    |
+---------------+---------------+
| ab +               | ab+ |
+---------------+---------------+

复制代码 代码如下:

2. VARCHAR

 

语法:

VARCHAR(max-length)

中间,max-length是该品种字符串最多能够储存的字符的个数。整个字段占用的长空尺寸是长度占领的字节数加上实际字符所据有的字节数。当字符串长度在0到255时,长度占1个字节,当字符串长度超过253个字符时,长度占2个字节。VARCHA奥迪Q5类型最多655叁拾几个字符。

 

mysql> create table s13 ( value varchar(10) primary key);

Query OK, 0 rows affected (0.02 sec)

 

mysql> insert into s13 values ('ABCD') , (' A B ');

Query OK, 2 rows affected (0.05 sec)

Records: 2  Duplicates: 0  Warnings: 0

 

mysql> select @@sql_mode;

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

| @@sql_mode              |

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

| PAD_CHAR_TO_FULL_LENGTH |

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

1 row in set (0.00 sec)

 

mysql> select length(value), char_length(value), value from s13;

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

| length(value) | char_length(value) | value |

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

|             5 |                  5 |  A B  |

|             4 |                  4 | ABCD  |

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

2 rows in set (0.00 sec)

 

从上述结果能够看来,PAD_CHAR_TO_FULL_LENGTH情势对于VARCHA揽胜极光类型未有功用,那么些方式只对CHA奥德赛类型有机能。

 

二、MYSQL数据类型的长度和节制

各数据类型及字节长度一览表:

数据类型 字节长度 范围或用法
Bit 1 无符号[0,255],有符号[-128,127],天缘博客备注:BIT和BOOL布尔型都占用1字节
TinyInt 1 整数[0,255]
SmallInt 2 无符号[0,65535],有符号[-32768,32767]
MediumInt 3 无符号[0,2^24-1],有符号[-2^23,2^23-1]]
Int 4 无符号[0,2^32-1],有符号[-2^31,2^31-1]
BigInt 8 无符号[0,2^64-1],有符号[-2^63 ,2^63 -1]
Float(M,D) 4 单精度浮点数。天缘博客提醒这里的D是精度,如果D<=24则为默认的FLOAT,如果D>24则会自动被转换为DOUBLE型。
Double(M,D) 8  双精度浮点。
Decimal(M,D) M+1或M+2 未打包的浮点数,用法类似于FLOAT和DOUBLE,天缘博客提醒您如果在ASP中使用到Decimal数据类型,直接从数据库读出来的Decimal可能需要先转换成Float或Double类型后再进行运算。
Date 3 以YYYY-MM-DD的格式显示,比如:2009-07-19
Date Time 8 以YYYY-MM-DD HH:MM:SS的格式显示,比如:2009-07-19 11:22:30
TimeStamp 4 以YYYY-MM-DD的格式显示,比如:2009-07-19
Time 3 以HH:MM:SS的格式显示。比如:11:22:30
Year 1 以YYYY的格式显示。比如:2009
Char(M) M
定长字符串。
VarChar(M) M 变长字符串,要求M<=255
Binary(M) M 类似Char的二进制存储,特点是插入定长不足补0
VarBinary(M) M 类似VarChar的变长二进制存储,特点是定长不补0
Tiny Text Max:255 大小写不敏感
Text Max:64K 大小写不敏感
Medium Text Max:16M 大小写不敏感
Long Text Max:4G 大小写不敏感
TinyBlob Max:255 大小写敏感
Blob Max:64K 大小写敏感
MediumBlob Max:16M 大小写敏感
LongBlob Max:4G 大小写敏感
Enum 1或2 最大可达65535个不同的枚举值
Set 可达8 最大可达64个不同的值
Geometry    
Point    
LineString    
Polygon    
MultiPoint    
MultiLineString    
MultiPolygon    
GeometryCollection    

  MySql常用数据类型定义了列中可以储存什么数据甚至这么些多少实际上怎么存款和储蓄。大概可以分成三类:

例如:

3. 字段长度限定

(1卡塔尔主键为VARCHACRUISER类型时的尺寸约束为30三十叁个字符。

mysql> create table s5 ( value varchar(65535) primary key);

ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes

mysql> create table s5 ( value varchar(3072) primary key);

Query OK, 0 rows affected (0.02 sec)

 

(2卡塔尔(قطر‎VARCHAEvoque类型的字段的长短超过或等于65536时,自动转载为TEXT相关项目。

缘由正是因为VARCHAMustang类型在存款和储蓄时要封存字符串长度,何况最多占用2个字节。

mysql> create table s6 ( value varchar(3072) primary key , v varchar(65536));

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

 

mysql> show warnings;

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

| Level | Code | Message                                    |

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

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

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

1 row in set (0.00 sec)

 

mysql> show create table s6;

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

| Table | Create Table                                                                                                                           |

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

| s6    | CREATE TABLE `s6` (

  `value` varchar(3072) NOT NULL,

  `v` mediumtext,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

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

1 row in set (0.00 sec)

 

 

(3卡塔尔国八个行中的VARCHAWrangler和CHALacrosse类型的字符串的最大尺寸总和不可能抢先655三12个字符。

mysql> create table s12 ( value  int  primary key , v varchar(65535));

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

 

mysql> create table s12 ( value  int  primary key , v varchar(65500));

Query OK, 0 rows affected (0.03 sec)

 

 

(4卡塔尔(قطر‎当CHA卡宴类型的字段插入超越定义长度的数目时,将自行截取为定义长度。

mysql> show create table s1;

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

| Table | Create Table                                                                                                  |

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

| s1    | CREATE TABLE `s1` (

  `value` char(10) NOT NULL,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

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

1 row in set (0.00 sec)

 

mysql> insert into s1 values ('12345678901234');

Query OK, 1 row affected, 1 warning (0.01 sec)

 

mysql> show warnings;

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

| Level   | Code | Message                                    |

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

| Warning | 1265 | Data truncated for column 'value' at row 1 |

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

1 row in set (0.00 sec)

 

mysql> select * from s1;

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

| value        |

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

|              |

| 1234567890   |

| 中           |

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

3 rows in set (0.00 sec)

 

 

(5卡塔尔国当VARCHA科雷傲类型的字段在插入数据时长度抢先定义的尺寸,将自行截取到定义的长短。

mysql> insert into s13 values ('12345678901234');

Query OK, 1 row affected, 1 warning (0.01 sec)

 

mysql> show warnings;

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

| Level   | Code | Message                                    |

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

| Warning | 1265 | Data truncated for column 'value' at row 1 |

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

1 row in set (0.00 sec)

 

mysql> select * from s13;

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

| value      |

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

|  A B       |

| 1234567890 |

| ABCD       |

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

3 rows in set (0.00 sec)

 

 

 

 

 

一、MySQL的数据类型

要害富含以下中国共产党第五次全国代表大会类:

卡尺头体系:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT

浮点数类型:FLOAT、DOUBLE、DE思铂睿L

字符串类型:CHAHaval、VARCHASportage、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB

日子类型:Date、DateTime、TimeStamp、Time、Year

别的数据类型:BINASportageY、VARBINA路虎极光Y、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等

 

1、整型

MySQL数据类型 含义(有符号)
tinyint(m) 1个字节  范围(-128~127)
smallint(m) 2个字节  范围(-32768~32767)
mediumint(m) 3个字节  范围(-8388608~8388607)
int(m) 4个字节  范围(-2147483648~2147483647)
bigint(m) 8个字节  范围(+-9.22*10的18次方)

取值范围假诺加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。

 int(mState of Qatar里的m是表示SELECT查询结果集中的显得升幅,并不影响其实的取值范围,未有影响到呈现的肥瘦,不知晓这些m有何用。

 

2、浮点型(float和double)

MySQL数据类型 含义
float(m,d) 单精度浮点型    8位精度(4字节)     m总个数,d小数位
double(m,d) 双精度浮点型    16位精度(8字节)    m总个数,d小数位

设贰个字段定义为float(6,3卡塔尔,借使插入三个数123.45678,实际数据Curry存的是123.457,但总个数还以实际为准,即6位。整数有的最大是3位,要是插入数12.123456,存款和储蓄的是12.1234,假使插入12.12,存款和储蓄的是12.1200.

 

3、定点数

浮点型在数据库中贮存的是看似值,而稳固类型在数据库中贮存的是准确值。 

decimal(m,d卡塔尔国 参数m<65 是总个数,d<30且 d<m 是小数位。

 

4、字符串(char,varchar,_text)

MySQL数据类型 含义
char(n) 固定长度,最多255个字符
varchar(n) 固定长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符

char和varchar:

1.char(nState of Qatar若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存款和储蓄的字符串末尾无法有空格,varchar不限于此。 

2.char(n)一定长度,char(4卡塔尔(قطر‎不管是存入多少个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255卡塔尔(قطر‎,

之所以varchar(4卡塔尔国,存入3个字符将占用4个字节。 

3.char类型的字符串检索速度要比varchar类型的快。
varchar和text: 

1.varchar可钦命n,text不能够钦命,内部存款和储蓄varchar是存入的实际上字符数+1个字节(n<=255)或2个字节(n>255卡塔尔(قطر‎,text是实际上字符数+2个字

节。 

2.text类型不能有默许值。 

3.varchar可平素开立索引,text创造索引要钦赐前某个个字符。varchar查询速度快于text,在都创立索引的情状下,text的目录如同不起效能。

 

5.二进制数据(_Blob)

1._BLOB和_text存款和储蓄格局各异,_TEXT以文件情势存款和储蓄,爱尔兰语存款和储蓄区分朗朗上口写,而_Blob是以二进制格局存款和储蓄,不分大小写。

2._BLOB存款和储蓄的数据只可以完全读出。 

3._TEXT能够内定字符集,_BLO不用内定字符集。

 

6.日申时间档案的次序

MySQL数据类型 含义
date 日期 '2008-12-2'
time 时间 '12:25:36'
datetime 日期时间 '2008-12-2 22:06:44'
timestamp 自动存储记录修改时间

若定义二个字段为timestamp,这一个字段里的岁月数额会随别的字段修改的时候自动刷新,所以这么些数据类型的字段能够寄存这条记下最终被改良的时刻。

 

数据类型的习性

 

MySQL关键字 含义
NULL 数据列可包含NULL值
NOT NULL 数据列不允许包含NULL值
DEFAULT 默认值
PRIMARY KEY 主键
AUTO_INCREMENT 自动递增,适用于整数类型
UNSIGNED 无符号
CHARACTER SET name 指定一个字符集

 

日期和岁月数据类型

数据类型 说明
DATA 表示1000-01-01~9999-12-31之间的日期,格式为yyyy-mm-dd
TIME 格式为HH:MM:SS
DATATIME DATA和TIME的组合
TIMESTAMP 功能和DATETIME相同,但是范围较小
YEAR 若2位数字表示,范围是1970~2069年。若是用4位表示,范围是1901~2155年。

CHA兰德奔驰G级和VARCHACR-V类型雷同,但它们保存和探求的格局各异。它们的最大尺寸和是不是尾巴部分空格被封存等地方也不及。在蕴藏或探求进程中不举办高低写调换。

8. BLOB

BLOB相关品种也可以有相通的六种类型:

有各类BLOB相关品种,它们之间的差异在于允许的最大尺寸不平等。

TINYBLOB:1到252个字节。字段长度前缀1个字节。

 BLOB:256到655三十多个字节。字段长度前缀2个字节。

 MEDIUMBLOB:65536到2的二十一次方-1个字节。字段长度前缀3个字节。

LONGBLOB:2的贰拾贰回方到2的叁11遍方-1个字节。字段长度前缀4个字节。

mysql> create table b11 ( value int primary key, v blob(100));

Query OK, 0 rows affected (0.03 sec)

 

在定义数据表时,若是选取BLOB(N卡塔尔国的样式定义字段,则实在字段类型被活动调度为最符合最大尺寸N的BLOB相关项目。

mysql> show create table b11;

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

| Table | Create Table                                                                                                                    |

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

| b11   | CREATE TABLE `b11` (

  `value` int(11) NOT NULL,

  `v` tinyblob,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

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

1 row in set (0.00 sec)

 

 

BLOB相关项目在其实存款和储蓄和读取时,不会发出长度补足操作和截取操作,而是存款和储蓄和读取原始二进制数据内容。

 

mysql> insert into b11 values (1,unhex('01020300010203')),(2,'1234567890');

Query OK, 2 rows affected (0.01 sec)

Records: 2  Duplicates: 0  Warnings: 0

 

mysql> select value, v,hex(v) from b11;

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

| value | v          | hex(v)               |

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

|     1 |      | 01020300010203       |

|     2 | 1234567890 | 31323334353637383930 |

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

2 rows in set (0.00 sec)

 

  1. CHAGL450 语法: CHA凯雷德 (length卡塔尔(قطر‎ 此中 length 的取值范围为 1 到 255 。 当先255 则报错:...

text和blob

 

在采取text和blob字段类型时要小心以下几点,以便更加好的发挥数据库的质量。

①BLOB和TEXT值也会孳生自个儿的有的主题材料,特别是实践了大气的去除或更新操作的时候。删除这种值会在数据表中留给十分的大的"空洞",今后填入这么些"空洞"的记录也许长度差别,为了增加质量,建议准时采纳OPTIMIZE TABLE 成效对那类表举行零散收拾.

②施用合成的(synthetic)索引。合成的索引列在有个别时候是一蹴而就的。一种方法是根据其他的列的剧情创立叁个散列值,并把这几个值存款和储蓄在单独的数据列中。接下来您就足以通过寻觅散列值找到数据行了。不过,我们要小心这种技能只好用于标准相称的查询(散列值对于相似<或>=等范围搜索操作符 是从未有过用途的)。我们能够行使MD5(卡塔尔(قطر‎函数生成散列值,也得以动用SHA1(卡塔尔国或CRC32(卡塔尔(قطر‎,恐怕利用本人的应用程序逻辑来测算散列值。请记住数值型散列值可以异常高功能地蕴藏。同样,倘使散列算法生成的字符串带有尾巴部分空格,就无须把它们存款和储蓄在CHAXC60或VARCHA索罗德列中,它们会碰到尾部空格去除的熏陶。

合成的散列索引对于那一个BLOB或TEXT数据列非常有用。用散列标记符值查找的快慢比寻觅BLOB列自个儿的进程快很多。

③在无需的时候幸免予检查索大型的BLOB或TEXT值。举例,SELECT *询问就不是很好的主见,除非你可见分明作为限定原则的WHERE子句只会找到所要求的数据行。否则,你恐怕毫无指标地在网络上传输多量的值。那也是 BLOB或TEXT标记符消息存款和储蓄在合成的索引列中对我们有着援救的事例。你能够寻觅索引列,决定那个急需的数量行,然后从合格的数目行中检索BLOB或 TEXT值。

④把BLOB或TEXT列分离到独门的表中。在一些条件中,假使把那个数据列移动到第二张数据表中,能够让您把原数据表中 的数据列转变为稳固长度的数据行格式,那么它便是有含义的。那会减弱主表中的碎片,让你获得一定长度数据行的性质优势。它还使您在主数据表上运行SELECT *询问的时候不会通过网络传输多量的BLOB或TEXT值。

  从前使用数据库的时候不是很上心列类型的选用,前日算是临时间小结一下。随笔参照他事他说加以考察了MySql5.1参照他事他说加以调查手册,《MySql必知必会》等,并无太多人的资历成分。迎接大家补充。

同CHARubicon比较,VARCHA途达值保存时只保留须求的字符数,另加叁个字节来记录长度(假若列评释的长度超越255,则选用多个字节卡塔尔国。

MySQL幼功知识01数据类型(一State of Qatar字符串相关品种,mysql数据类型

慎选数据类型的中坚尺度

前提:使用符合储存引擎。

分选标准:遵照选定的储存引擎,明确怎么着选取适宜的数据类型。

下边包车型大巴接纳格局按存款和储蓄引擎分类:

  • MyISAM 数据存款和储蓄引擎和数据列:MyISAM数据表,最棒使用固定长度(CHAPAJERO卡塔尔国的多少列替代可变长度(VARCHAENCOREState of Qatar的数据列。
  • MEMO本田CR-VY存款和储蓄引擎和数据列:MEMO帕杰罗Y数据表这段日子都使用固定长度的数额行存储,因而无论采用CHAEnclave或VARCHA福睿斯列都不曾关系。两个都以用作CHAEvoque类型管理的。
  • InnoDB 存款和储蓄引擎和数据列:建议选拔 VARCHAEscort类型。

对于InnoDB数据表,内部的行存款和储蓄格式未有分歧固定长度和可变长度列(全体数据行都使用指向数据列值的头指针),由此在精气神上,使用一定长度的CHALacrosse列不自然比使用可变长度VARCHA阿斯顿·马丁DB11列轻便。因此,首要的特性因素是数据行使用的蕴藏总数。由于CHAHaval平均占用的半空中多于VARCHAENCORE,因而使用VARCHA中华V来最小化须求管理的数据行的贮存总的数量和磁盘I/O是相比好的。

下边说一下原则性长度数据列与可变长度的数据列。

  1. 数值型类型
  2. 日期和岁月
  3. 字符串

依赖分配给列的字符集查对准绳对CHA酷威和VARCHA卡宴列中的值进行排序和相比较。

7. TEXT

有八种TEXT相关项目,它们中间的反差在于允许的最大尺寸不均等。

TINYTEXT:1到251个字节。字段长度前缀1个字节。

 TEXT:256到65539个字节。字段长度前缀2个字节。

 MEDIUMTEXT:65536到2的贰十一回方-1个字节。字段长度前缀3个字节。

LONGTEXT:2的贰13回方到2的33遍方-1个字节。字段长度前缀4个字节。

 

在开立数量表时,在CREATE TABLE语句中只使用TEXT类型就能够,MySQL将依附TEXT(N卡塔尔(قطر‎中的N自动决定实际上应用TINYTEXT或TEXT或MEDIUMTEXT或LONGTEXT。在动用其它多个档案的次序时则并未有这种基于长度自动决定其实类型的效能,何况无法钦点最大尺寸。

 

mysql> create table b3 ( value int primary key , v text(30) );

Query OK, 0 rows affected (0.04 sec)

 

mysql> show create table b3;

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

| Table | Create Table                                                                                                                   |

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

| b3    | CREATE TABLE `b3` (

  `value` int(11) NOT NULL,

  `v` tinytext,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

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

1 row in set (0.00 sec)

 

mysql> create table b4 ( value int primary key , v text(65536) );

Query OK, 0 rows affected (0.02 sec)

 

mysql> show create table b4;

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

| Table | Create Table                                                                                                                     |

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

| b4    | CREATE TABLE `b4` (

  `value` int(11) NOT NULL,

  `v` mediumtext,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

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

1 row in set (0.00 sec)

 

mysql> create table b5 ( value int primary key , v text(300) );

Query OK, 0 rows affected (0.02 sec)

 

mysql> show create table b5;

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

| Table | Create Table                                                                                                               |

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

| b5    | CREATE TABLE `b5` (

  `value` int(11) NOT NULL,

  `v` text,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

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

1 row in set (0.01 sec)

 

TEXT类型和VARCHAOdyssey类型雷同,并不会开展长度补足的操作。

 

三、使用建议

1、在钦定数据类型的时候日常是利用从小原则,比方能用TINY INT的最佳就绝不INT,能用FLOAT类型的就绝不DOUBLE类型,那样会对MYSQL在运营成效上进步一点都不小,特别是时局据量测验条件下。

2、无需把数据表设计的太过复杂,功效模块上有别或者对于前期的保安更为有助于,严慎现身杂炖数据表

3、数据表和字段的起名字也是一门学问

4、设计数据表结构早先请先想象一下是您的屋家,只怕结果会愈加合理、高效

5、数据库的最终设计结果必然是效用和可扩张性的折中,偏侧任何一方都以不妥的

 

数值型类型

  MySql扶助八种数值数据类型,有例外的取值范围。此中好些个的数值数据类型都能够有号子或许无符号(BIT无符号),暗中认可的是有标记。数值型类型富含严刻数值数据类型(INTEGE奥迪Q5、SMALLINT、DEGIENIAL和NUME奥迪Q3IC卡塔尔国,以致相符数值数据类型(FLOAT、REAL和DOUBLE PRECISION卡塔尔。作为SQL标准的恢宏,MySQL也扶助整数项目TINYINT、MEDIUMINT和BIGINT。上面包车型大巴表显示了亟待的种种整数类型的积攒和界定。对于浮点列类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。

  DECIMAL和NUMERIC类型在MySQL中实属等同的档期的顺序。它们用于保存必得为适当精度的值,比方货币数据。当注脚该项指标列时,能够(并且普通要卡塔尔国钦定精度和标度;举个例子:salary DEAccordL(5,2卡塔尔

  FLOAT类型和DOUBLE类型用于表示相同数值数据类型。

  至于浮点数和定点数须求小心的

  1. 浮点数存在相对误差。
  2. 对货币等精度敏感的多寡,应该用定点数表示和储存。
  3. 编制程序中,尽量幸免浮点数的相比。
  4. 精心浮点数中特殊值的管理。

 

请小心有所MySQL版本均如此,而且它不受SQL服务器形式的影响。

4. 字符集

暗许情状下,数据表的字符集为latin1。可以在create table恐怕alter table时更改数据表的字符集为utf8。

 

mysql> show variables like '%character%';

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

| Variable_name            | Value                      |

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

| character_set_client     | utf8                       |

| character_set_connection | utf8                       |

| character_set_database   | latin1                     |

| character_set_filesystem | binary                     |

| character_set_results    | utf8                       |

澳门新濠登录网址,| character_set_server     | latin1                     |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

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

8 rows in set (0.01 sec)

 

mysql> show create table s1;

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

| Table | Create Table                                                                                                  |

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

| s1    | CREATE TABLE `s1` (

  `value` char(10) NOT NULL,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

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

1 row in set (0.00 sec)

 

 

mysql> select length(value) , char_length(value) , value from s1;

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

| length(value) | char_length(value) | value |

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

|             3 |                  1 | 中    |

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

1 row in set (0.00 sec)

 

LENGTH表示字节数,CHA奥迪Q5_LENGTH代表字符数。在接收UTF8字符集时,多个汉字的字节数为3,即LENGTH为3,;而叁在那之中国字的字符数仍是1,即CHA奥迪Q3_LENGTH仍然为1。

 

char与varchar

CHAGL450和VARCHA奥迪Q7类型形似,但它们保存和寻觅的法子各异。它们的最大尺寸和是还是不是尾巴部分空格被封存等方面也不及。在仓库储存或搜求进程中不举行高低写调换。

下边包车型大巴表显示了将种种字符串值保存到CHA奥迪Q7(4卡塔尔和VARCHA雷克萨斯RC(4卡塔尔(قطر‎列后的结果,表明了CHA奔驰G级和VARCHAHaval之间的间隔:

CHAR(4) 存储需求 VARCHAR(4) 存储需求
'' '    ' 4个字节 '' 1个字节
'ab' 'ab  ' 4个字节 'ab ' 3个字节
'abcd' 'abcd' 4个字节 'abcd' 5个字节
'abcdefgh' 'abcd' 4个字节 'abcd' 5个字节

请小心上表中最后一行的值只适用不应用严峻方式时;倘诺MySQL运营在严刻方式,超越列长度不的值保存**,并且会鬼使神差谬误。

从CHAGL450(4卡塔尔(قطر‎和VARCHA索罗德(4卡塔尔(قطر‎列车检查索的值并不三番若干回相符,因为检索时从CHAR列删除了尾巴部分的空格。通过上面包车型的士例证表明该间距:
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.02 sec)
 
mysql> INSERT INTO vc VALUES ('ab  ', 'ab  ');
Query OK, 1 row affected (0.00 sec)
 
mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
+----------------+----------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+----------------+
| ab  +          | ab+            |
+----------------+----------------+
1 row in set (0.00 sec)

对于尾巴部分填充字符被裁剪掉或比较时将它们忽略掉的景观,假诺列的目录须要独一的值,在列内插入一个只是填充字符数不相同的值将会招致复制键值错误。

6. VARBINARY

VARBINAQX56Y与BINAPAJEROY形似,二者之间差距与 VARCHATiggo和CHA揽胜之间的差别相像。而VARBINALANDY和VARCHA卡宴也很周边,二者之间的异样与BINA奔驰G级Y和CHA君越之间的歧异相似。

当最大尺寸为0到255字节时,长度前缀为1个字节,字段总参谋长度为1+最大尺寸个字节。

当最大尺寸为256到65535字节时,长度前缀为2个字节。

 

mysql> create table b2 ( value varbinary(10) primary key);

Query OK, 0 rows affected (0.03 sec)

 

mysql> insert into b2 values ( '1234567890'), ("123"), (unhex('01020300010203'));

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 0

 

mysql> select value, hex(value) from b2;

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

| value      | hex(value)           |

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

|      | 01020300010203       |

| 123        | 313233               |

| 1234567890 | 31323334353637383930 |

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

3 rows in set (0.00 sec)

 

 

当VARBINA奥迪Q3Y类型超越65535字节时,将机关调换为BLOB相关项目。

mysql> create table b9 ( value int  primary key, v varbinary(65536));

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

 

mysql> show warnings;

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

| Level | Code | Message                                      |

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

| Note  | 1246 | Converting column 'v' from VARBINARY to BLOB |

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

1 row in set (0.00 sec)

 

mysql> show create table b9;

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

| Table | Create Table                                                                                                                     |

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

| b9    | CREATE TABLE `b9` (

  `value` int(11) NOT NULL,

  `v` mediumblob,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

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

1 row in set (0.00 sec)

 

 

固然在varchar中写入过量设定的尺寸,暗许情状下会截去前边的某个。

5. BINARY

BINAPRADOY用法与CHA中华V雷同,只是能够积攒全数字符值,饱含空字符(ASCII值为0卡塔尔国,而且末尾补足长度的字符为空字符,实际不是空格。BINAEvoqueY类型最大尺寸254个字节,并不是251个字符。

 

mysql> create table b1 (value binary(10) primary key);

Query OK, 0 rows affected (0.03 sec)

 

mysql> insert into b1 values('1234567890') , ('123');

Query OK, 2 rows affected (0.01 sec)

Records: 2  Duplicates: 0  Warnings: 0

 

mysql> select value,hex(value) from b1;

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

| value      | hex(value)           |

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

| 123        | 31323300000000000000 |

| 1234567890 | 31323334353637383930 |

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

2 rows in set (0.00 sec)

 

 

运用unhex(卡塔尔(قطر‎函数能够将十四进制字符串转变为不可知字符组成的字符串,插入不可以预知字符的事比方下:

mysql> insert into b1 values ( unhex('01020300010203'));

Query OK, 1 row affected (0.01 sec)

 

mysql> select value,hex(value) from b1;

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

| value      | hex(value)           |

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

|      | 01020300010203000000 |

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

1 row in set (0.00 sec)

 

 

当BINA陆风X8Y类型超越2五12个字节时,将报错。

mysql> create table b10 ( value int  primary key, v binary(256));

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

 

VARCHACRUISER列中的值为可变长字符串。长度能够钦命为0到65,535以内的值。(VARCHAHaval的最大实用长度由最大行大小和使用的字符集分明。全体最大尺寸是65,532字节)。

1. CHAR

语法:

CHAR (length)

里头length的取值范围为1到255。

 

超过255则报错:

mysql> create table s3 ( value char(1023) primary key);

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

 

比如:CHAEvoque(20卡塔尔表示最多带有十多少个字符的字符串。存款和储蓄时,不足贰11个字符时前面加空格。

在私下认可意况下,提取时,自动删除掉前边的空格;在PAD_CHAR_TO_FULL_LENGTH时,则不会去除前面包车型客车空格,即提取后的结果包括18个字符。

 

一旦存在如下数据:

mysql> show create table s1;

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

| Table | Create Table                                                                                                    |

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

| s1    | CREATE TABLE `s1` (

  `value` char(10) NOT NULL,

  PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

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

1 row in set (0.00 sec)

 

mysql> insert into s1 values ('ABC') ,  ('1234567890') , (' 12 3 45 ');

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 0

 

 

在暗中同意情形下:

mysql> set sql_mode='';

Query OK, 0 rows affected (0.00 sec)

 

mysql> select length(value) , char_length(value) , value from s1;

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

| length(value) | char_length(value) | value      |

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

|             8 |                  8 |  12 3 45   |

|            10 |                 10 | 1234567890 |

|             3 |                  3 | ABC        |

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

3 rows in set (0.00 sec)

 

 

在sql_mode为PAD_CHAR_TO_FULL_LENGTH时,将不会去除CHA奥迪Q5类型的字符串后边附加的空格。

mysql> set sql_mode='pad_char_to_full_length';

Query OK, 0 rows affected (0.00 sec)

 

mysql> select length(value) , char_length(value) , value from s1;

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

| length(value) | char_length(value) | value      |

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

|            10 |                 10 |  12 3 45   |

|            10 |                 10 | 1234567890 |

|            10 |                 10 | ABC        |

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

3 rows in set (0.00 sec)

 

mysql> select @sql_mode;

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

| @sql_mode |

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

| NULL      |

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

1 row in set (0.00 sec)

 

mysql> select @@sql_mode;

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

| @@sql_mode              |

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

| PAD_CHAR_TO_FULL_LENGTH |

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

1 row in set (0.00 sec)

 

 

 

 

二、详解(MySQL5.1):

上边包车型地铁表突显了将各类字符串值保存到CHA普拉多(4卡塔尔(قطر‎和VARCHA奥德赛(4卡塔尔国列后的结果,说明了CHA途胜和VARCHALAND之间的反差:

一、演变:

CHAR(4) 存储需求 VARCHAR(4) 存储需求
'' '     ' 4个字节 '' 1个字节
'ab' 'ab  ' 4个字节 'ab ' 3个字节
'abcd' 'abcd' 4个字节 'abcd' 5个字节
'abcdefgh' 'abcd' 4个字节 'abcd' 5个字节

CHAV8 Vantage和VARCHALacrosse类型证明的长度表示您想要保存的最大字符数。举例,CHAOdyssey(30卡塔尔(قطر‎能够占有三十多个字符。

在MySQL5.0.3及以上的版本中,varchar数据类型的长度扶持到了65535,也便是说能够寄放65531个字节的多寡,开首位和终结位占去了3个字节,也等于说,在5.0.3之下版本中供给使用固定的TEXT或BLOB格式存放的数目足以在高版本中运用可变长的varchar来寄存,那样就能够使得的减少数据库文件的轻重缓急。

假如分配给CHAHaval或VARCHA库罗德列的值当先列的最大尺寸,则对值举行裁剪以使其切合。假使被开掉的字符不是空格,则会时有发生一条警报。假若裁剪非空格字符,则会导致错误(实际不是警戒State of Qatar并经过应用严厉SQL方式禁止使用值的插入。

请细心上表中最后一行的值只适用不选拔严酷格局时;假如MySQL运营在严俊方式,超过列长度不的值不保留,何况会并发错误。

复制代码 代码如下:

mysql> INSERT INTO names VALUES ('Monty ', 'Monty ');
Query OK, 1 row affected (0.00 sec)

ASCII属性为CHARubicon列分配latin1字符集。UNICODE属性分配ucs2字符集。

mysql> SELECT myname = 'Monty ', yourname = 'Monty ' FROM names;
+-----------------------------+-------------------------------+
| myname = 'Monty ' | yourname = 'Monty ' |
+-----------------------------+-------------------------------+
| 1 | 1 |
+-----------------------------+-------------------------------+
1 row in set (0.00 sec)

CHA途观 BYTE是CHATiguan BINAENCOREY的外号。那是为了有限协助兼容性。

VARCHAGL450值保存时不开展填空。当班值日保存和寻觅时尾部的空格仍保存,切合标准SQL。

mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
+----------------+----------------+
| CONCAT(v, '+') | CONCAT(c, '+') |
+----------------+----------------+
| ab + | ab+ |
+----------------+----------------+
1 row in set (0.00 sec)

CHATiggo列的尺寸固定为创建表时表明的长短。长度可认为从0到255的别样值。当保存CHAHighlander值时,在它们的左侧填充空格以实现钦点的长短。当检索到CHAWrangler值时,尾部的空格被去除掉。在存款和储蓄或探求进度中不开展高低写转变。

mysql> CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10));
Query OK, 0 rows affected (0.09 sec)

MySQL数据库的varchar类型在5.0.3之下的本子中的最大尺寸约束为255,其数据范围能够是0~255。

MySQL数据库的varchar类型在5.0.3以下的版本中的最大尺寸节制为255,其数额范围能够是0~255。 在MySQL5.0.3及以上的本子中,varchar数...

mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.02 sec)

请细心有所MySQL查对准则归于PADSPACE类。那表达在MySQL中的全体CHA奥德赛和VARCHAWrangler值比较时不须要考虑任何尾巴部分空格。

从CHAEscort(4卡塔尔和VARCHAPAJERO(4卡塔尔国列检索的值并不一而再相近,因为检索时从CHATiggo列删除了尾部的空格。
透过上面的事例表达该出入: