MySQL常用数据类型和建库策略
MySQL(二)数据库数据类型详解
MySQL(⼆)数据库数据类型详解 序⾔ 今天去健⾝了,感觉把⾝体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这⾥讲清楚了,以后在看到什么数据类型,咱度应该认识,下⾯就跟着我的节奏去把这个拿下吧。
---WZY⼀、数据类型 MySQL的数据类型有⼤概可以分为5种,分别是整数类型、浮点数类型和定点数类型、⽇期和时间类型、字符串类型、⼆进制类型。
现在可以来看看你对这5种类型的熟悉程度,哪个看起来懵逼了,那就说明⾃⼰哪个不熟悉,不理解。
注意:整数类型和浮点数类型可以统称为数值数据类型,这不难理解。
数值数据类型 整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 浮点数类型:FLOAT、DOUBLE 定点⼩数:DECIMAL ⽇期/时间类型 YEAR、TIME、DATE、DATETIME、TIMESTAMP 字符串类型 CHAR、VARCHAR、TEXT、ENUM、SET等 ⼆进制类型 BIT、BINARY、VARBINARY、BLOB 1、整数类型 不管你学什么语⾔,在基础⽅⾯,都应该知道 1个字节= 8位⼆进制数。
每个类型的取值范围也就能够知道,⽐如TINYINT占⽤1个字节,也就是8位,2的8次⽅减1等于255,也就是说如果代表没符号的整数,该取值范围为0~255,如果是有符号的,最⾼位为符号号位,也就是2的7次⽅减1,也就是127,取值范围为-128~127,为什么需要减1,这个问题就需要考虑临界值的问题了。
⽽考虑临界值问题⼜有需要讨论原码补码反码的知识,这些度不是我们讨论的重点,所以在这就⾃⾏百度。
给出⼀张范围表,给⼤家做参考。
不同整数类型的取值范围 根据⾃⼰所需去选取不同的类型名称, 例如: CREATE TABLE aaa( id INT(10) PRIMARY KEY, age INT(6) ); 这个例⼦中INT(10)、INT(6) 括号中的数字表⽰的是该数据类型指定的显⽰宽度,指定能够显⽰的数值中数字的个数。
Mysql数据类型(字段)介绍
MySql数据库的列类型(字段类型)MySQL数据库的表是一个二维表,由一个或多个数据列构成。
每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。
MySQL中的列类型有三种:数值类、字符串类和日期/时间类。
从大类来看列类型和数值类型一样,都是只有三种。
但每种列类型都还可细分。
下面对各种列类型进行详细介绍。
数值类的数据列类型数值型的列类型包括整型和浮点型两大类。
TINYINT:1字节非常小的正整数,带符号:-128~127,不带符号:0~255SMALLINT:2字节小整数,带符号:-32768~32767,不带符号:0~65535MEDIUMINT:3字节中等大小的整数,带符号:-8388608~8388607,不带符号:0~16777215INT:4字节标准整数,带符号:-2147483648~2147483647,不带符号:0~4294967295BIGINT:8字节大整数,带符号:-9223372036854775808~9233372036854775807,不带符号:0~18446744073709551615FLOAT:4字节单精度浮点数,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38 DOUBLE:8字节双精度浮点数,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308DECIMAL:M+2字节以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。
整型数据列类型MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。
它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。
mysql数据库的number类型
mysql数据库的number类型全文共四篇示例,供读者参考第一篇示例:MySQL数据库的Number类型是一种非常常用的数据类型,它用来存储数值型数据,包括整数和小数。
在实际的数据库设计和开发中,我们经常会用到Number类型来存储各种数字数据,比如订单金额、产品价格、数量等等。
在本文中,我们将详细介绍MySQL数据库中的Number类型,包括其各种子类型和用法。
MySQL数据库中的Number类型主要包括两种子类型,即整数型和浮点型。
整数型包括TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT,分别用来存储不同范围的整数数据。
浮点型包括FLOAT和DOUBLE,用来存储小数数据。
下面我们将分别介绍这些Number类型的特点和用法。
1. TINYINTTINYINT类型用来存储小范围的整数数据,取值范围为-128到127。
TINYINT类型占用1个字节的存储空间,适用于存储性别、状态等只有两个取值的数据。
6. FLOATFLOAT类型用来存储单精度浮点数,即小数数据。
FLOAT类型占用4个字节的存储空间,可以存储6-7位的有效数字,适用于存储科学计算、工程测量等领域的数据。
第二篇示例:MySQL数据库中的number类型主要用于存储数值型数据,包括整型和浮点型两种。
整型数据包括TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT,而浮点型数据包括FLOAT和DOUBLE。
在数据库表的设计中,合理地选择number类型可以提高数据库的性能和数据存储效率。
让我们来了解一下MySQL数据库中number类型的具体描述和用法。
1. TINYINT:TINYINT类型用于存储非常小的整数数据,范围在-128到127之间。
它占用1个字节的存储空间,适用于存储布尔类型数据或者只需要记录小整数的场景。
6. FLOAT:FLOAT类型用于存储单精度浮点数数据,范围在-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38之间。
完整Mysql燕十八学习笔记
Mysql 三大列类型1. 数值型整型Tinyint 、Smallint、Mediumint 、Int、Bigint小数型Float(D,M),Decimal(D,M)2. 字符串型Char(M)Varchar(M)Text 文本类型3. 日期时间类型Date 日期Time 时间Datetime 时间类型Year年类型一.整型列的字节与存储范围从数学上讨论tinyint ,建表时既能足够存放,又不浪费空间。
即:(1). 占据空间(2). 存储范围通过占用字节和所存范围分关系合理的选择类型例:Tinyint经测试,Tinyint 的默认为有符号-128~127之间,当越界时自动取相应 的边界值。
若要存0~255无符号时:列的可选属性:Tinyin t (M ) un sig ned zerofill.M :宽度(在0填充的时候才有意义)Un sig ned:无符号类型(非负),影响存储范围 Zerofill :0填充(默认无符号)1> insert into test-> (name,age3)-> ualu&s->「赵六'/S');u QIC, 1 row aff©et&d (0.00 soc)箕from t&st;I id I name I age I agel I age2 I age3 I卜--------- + ------------- + --------------- + -------------- + --------------- + ----------------- +rows in at (0.07 SEC)列可以声明默认值,而且推荐声明默认值not null default 0; ysql> alter table test add tinyint(3j not null default 0;uery 0IC, 9 rows affected (0.13 $ec)ecords: 9 Duplicates: 0 Uarnings: O小数型/浮点型、定点型Float(M,D):M代表总位数,D代表小数位(6,2)为例:-9999.99 ->9999.99 12345G789一一一一张张张张李张李王制LLuNi NULLLLuNLLJNI NULL NULLLLuN三四三四五六6NULL NULL I NULL ILLuNNULL | 2G0 | NULL | NULL !NULL I 0 I NULL I NULL |NULL I NULL I 127 I NULL Iy$ql> t M from 七。
mysql 的数组格式
mysql 的数组格式在 MySQL 中,可以使用数组数据类型来存储多个值在一个字段中。
MySQL 数组是一种特殊的数据类型,用于存储一个值的列表。
每个数组元素都可以单独访问,并且可以使用索引来访问特定的元素。
在 MySQL 中,可以使用以下语法定义一个数组字段:column_name data_type(array_size)其中,column_name 是字段的名称,data_type 是该字段的数据类型,array_size 是数组的大小。
例如,如果要定义一个名为students 的表,其中包含一个整数类型的 age 数组字段,可以使用以下 SQL 语句:CREATE TABLE students (id INT,age INT ARRAY(3));在这个例子中,age 字段是一个整数类型的数组,大小为 3。
这意味着它可以存储最多3 个整数。
要插入数据到数组字段中,可以使用以下语法:INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);例如,如果要向 students 表插入一条记录,其中 age 字段包含三个整数值 10、15 和 20,可以使用以下 SQL 语句:INSERT INTO students (id, age) VALUES (1, ARRAY[10, 15, 20]);要查询数组字段中的值,可以使用以下语法:SELECT column_name[index] FROM table_name WHERE condition;例如,如果要查询 students 表中的第一个学生的年龄,可以使用以下 SQL 语句:SELECT age[0] FROM students WHERE id = 1;这将返回值为 10,即 age 数组的第一个元素。
可以通过改变索引来访问数组中的其他元素。
mysql建表原则
mysql建表原则MySQL建表原则MySQL是一种常用的关系型数据库管理系统,它的建表原则对于数据库设计和优化非常重要。
下面我们将详细介绍MySQL建表的原则,以便开发人员能够更好地利用MySQL数据库。
一、命名规范1.1 表名表名应该简洁明了,不要使用过长或者过于复杂的名称。
可以使用下划线(_)或者驼峰式命名法来命名表名。
1.2 列名列名也应该简洁明了,不要使用过长或者过于复杂的名称。
可以使用下划线(_)或者驼峰式命名法来命名列名。
二、数据类型选择2.1 数值类型在选择数值类型时,应该根据实际需要选择合适的数据类型。
比如:tinyint、smallint、mediumint、int和bigint等整数类型;float和double等浮点数类型。
2.2 字符串类型在选择字符串类型时,应该根据实际需要选择合适的数据类型。
比如:char、varchar和text等字符类型;binary、varbinary和blob等二进制类型。
三、主键与索引设计3.1 主键设计每个表都应该有一个主键,并且主键应该是唯一的。
通常情况下,主键使用自增长整数作为标识符。
3.2 索引设计在设计索引时,应该根据实际需要选择合适的索引类型。
比如:普通索引、唯一索引、全文索引和空间索引等。
四、表的结构设计4.1 表的字段设计在设计表的字段时,应该遵循以下原则:(1)尽量避免使用NULL值,因为它会占用额外的存储空间。
(2)尽量避免使用TEXT和BLOB类型,因为它们会占用大量的存储空间。
(3)尽量避免使用ENUM类型,因为它会增加查询的复杂度。
4.2 表的关系设计在设计表之间的关系时,应该遵循以下原则:(1)使用外键来建立表之间的关系。
(2)避免使用多对多关系,因为它会增加查询和维护的复杂度。
(3)尽量将数据拆分成多个表,以便更好地管理和维护数据。
五、性能优化原则5.1 数据库范式化将数据分解成多个独立的表,并通过外键建立关联。
sql数据库常用类型
sql数据库常用类型SQL数据库中有几种常用的数据类型,这些数据类型允许您在表中存储不同种类的数据。
这里列举了一些常见的SQL数据类型:1. 整数类型(Integer Types):- `INT`:用于存储整数值。
- `SMALLINT`:用于存储较小范围的整数值。
- `BIGINT`:用于存储较大范围的整数值。
2. 小数/浮点类型(Decimal/Floating-Point Types):- `DECIMAL(precision, scale)` 或`NUMERIC(precision, scale)`:用于存储精确的小数值,`precision` 表示总位数,`scale` 表示小数位数。
- `FLOAT` 或`REAL`:用于存储浮点数值,通常用于需要近似值的情况。
3. 字符类型(Character Types):- `CHAR(n)`:用于存储固定长度的字符串,最多可以存储`n` 个字符。
- `V ARCHAR(n)` 或`V ARCHAR2(n)`:用于存储可变长度的字符串,最多可以存储`n` 个字符。
- `TEXT`:用于存储大文本对象((长字符串),适合存储大段文本。
4. 日期和时间类型(Date and Time Types):- `DATE`:用于存储日期。
- `TIME`:用于存储时间。
- `DATETIME` 或`TIMESTAMP`:用于存储日期和时间。
- `INTERV AL`:用于存储时间间隔。
5. 二进制类型(Binary Types):- `BLOB`:用于存储二进制大对象,如图像、音频或视频文件等。
- `BYTEA`(PostgreSQL中):用于存储二进制数据。
6. 布尔类型(Boolean Type):- `BOOLEAN`:用于存储逻辑值(true或false)。
7. 枚举类型(Enum Types):- `ENUM`:允许您在有限的可能值列表中选择一个值。
Mysql及SQLyog建表说明
mysql数据类型与sqlyog中属性值的含义MySQL数据库的表是一个二维表,由一个或多个数据列构成。
每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。
MySQL中的列类型有三种:数值类、字符串类和日期/时间类。
从大类来看列类型和数值类型一样,都是只有三种。
但每种列类型都还可细分。
下面对各种列类型进行详细介绍。
数值类的数据列类型数值型的列类型包括整型和浮点型两大类。
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~9233372036854775807,不带符号: FLOAT:4字节单精度浮点数,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38 DOUBLE:8字节双精度浮点数,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308 DECIMAL:M+2字节以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。
整型数据列类型 MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。
它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。
数据库快速入门之MySQL篇
数据库快速入门之MySQL篇MySQL是一种开源的关系型数据库管理系统,在当前的互联网技术中被广泛使用。
MySQL以其高速、可靠、易于使用和扩展等特点,成为了一个备受好评的数据库选择。
本文将简单介绍MySQL的基本知识和操作。
一、MySQL的基础知识1.数据库的概念数据库是一个数据的集合,是经过组织和存储的集合。
在计算机领域中,常常用于管理和存储各种类型的数据,如文本、音频、视频等。
数据库具有数据存储、数据管理、数据统计分析等多种功能。
2.数据库管理系统的概念数据库管理系统(DBMS)是指管理数据的软件系统,它可以对数据进行操作、处理、存储和保护。
它是建立在数据库上的一个软件系统。
3.关系型数据库管理系统的概念关系型数据库管理系统(RDBMS)是一种使用关系型模型来管理数据库的管理系统。
在这种模型中,数据被存储在表格中,并且使用关键字来连接表格数据。
MySQL是一种典型的RDBMS。
二、MySQL的操作1.安装MySQLMySQL的安装相对比较简单,只需要下载MySQL的安装包,然后按照提示进行安装即可。
但需要注意的是,安装MySQL要检查操作系统是否支持,以及安装路径是否存在。
2.启动和关闭MySQL安装完成后,需要启动MySQL以进行一些操作。
可以通过在命令行中输入以下指令来启动MySQL:mysql -u root -ppassowrd: ********```其中,“-u”参数指定用户名,“-p”参数指定密码,“passowrd:********”是指输入密码,注意密码不会在终端上显示。
如果没有密码,则不需要输入密码。
关闭MySQL可以通过输入以下语句结束:```mysql> exit;```3.创建数据库在MySQL中创建数据库可以使用以下指令:mysql> create database dbname;```其中,“dbname”是指数据库名称。
如果需要使用创建的数据库,可以通过以下指令切换:```mysql> use dbname;```4.创建表格在MySQL中创建表格可以使用以下指令:```mysql> create table tablename ( field1 type1, field2 type2……); ```其中,“tablename”是指创建的表名,而“field1”和“type1”等则是表示创建的字段名称和类型。
数据库优化中的数据类型选择与存储长度优化(十)
数据库优化中的数据类型选择与存储长度优化概述:数据库的设计和优化是构建高效可靠系统的关键。
在数据库设计中,选择合适的数据类型以及优化存储长度是非常重要的。
本文将讨论数据库优化中的数据类型选择与存储长度优化的相关内容。
一、数据类型选择:1. 整数类型:在数据库中使用整数类型是非常常见的,但是不同整数类型的存储空间占用是有差异的。
在需求允许的情况下,应该选择尽可能小的整数类型来存储数据。
例如,如果某一列的取值范围在0-100之间,选择TINYINT类型(占用1字节)比INT类型(占用4字节)更为合适。
2. 浮点类型:在存储小数值时,应该根据需求选择合适的浮点类型。
一般情况下,FLOAT(占用4字节)适用于单精度浮点数,DOUBLE(占用8字节)适用于双精度浮点数。
如果对精度要求不高,可以考虑使用FLOAT类型,以减少存储空间。
3. 字符串类型:在选择字符串类型时,需要根据实际需求来决定。
VARCHAR类型适用于可变长度的字符串,较节省存储空间。
而CHAR类型适用于固定长度的字符串,尤其适合存储长度相等的字符串。
另外,应该根据实际情况来合理选择最大长度,避免浪费存储空间。
4. 日期与时间类型:日期与时间类型在数据库中使用广泛。
对于日期类型,应该选择DATE类型,占用3字节,而不是DATETIME类型,占用8字节。
对于时间类型,如果只需存储时分秒,则可以选择TIME类型,占用3字节。
合理选择日期与时间类型可以在一定程度上优化存储空间。
二、存储长度优化:1. 压缩技术:使用压缩技术来优化存储长度是一种有效的方法。
例如,在存储文本类型的数据时,可以使用压缩算法来减少数据的存储空间占用。
这样不仅可以减少磁盘空间的使用,还能提高数据传输的效率。
2. 数据分离与归档:对于历史数据或者不常访问的大型数据,可以进行数据分离与归档。
将不经常使用的数据从主数据库中剥离出来,存放在单独的归档数据库中。
这样可以减少主数据库的存储压力,提高查询性能。
MySQL的数据类型
MySQL的数据类型⽬录MySQL的数据类型数据库中的每个列都应该有适当的数据类型,⽤于限制或允许该列中存储的数据。
例如,列中存储的为数字,则相应的数据类型应该为数值类型。
如果使⽤错误的数据类型可能会严重影响应⽤程序的功能和性能,所以在设计表时,应该特别重视数据列所⽤的数据类型。
更改包含数据的列不是⼀件⼩事,这样做可能会导致数据丢失。
因此,在创建表时必须为每个列设置正确的数据类型和长度。
MySQL中定义数据字段的类型对你数据库的优化是⾮常重要的。
MySQL⽀持所有标准SQL数值数据类型。
MySQL⽀持多种类型,⼤致可以分为三类:数值⽇期/时间字符(串)类型。
数据类型分类1. 数值类型(整数类型和⼩数类型)整数类型:包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。
⼩数类型:浮点数类型包括 FLOAT 和 DOUBLE。
定点数类型为 DECIMAL。
2. ⽇期/时间类型包括 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP。
3. 字符类型(⽂本字符串和⼆进制字符串)字符串类型:包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET 等。
⼆进制类型:包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
数值类型MySQL⽀持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLEPRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且⽀持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也⽀持整数类型TINYINT、MEDIUMINT和BIGINT。
MYSQL数据库四种索引类型介绍
MYSQL数据库四种索引类型介绍MySQL数据库提供了四种索引类型,包括B树索引、哈希索引、全文索引和空间索引。
下面将逐一介绍这些索引类型。
1.B树索引B树索引是MySQL中最常用的索引类型,也是默认的索引类型。
它使用B树数据结构来存储索引数据,每个节点包含多个键值对和指向子节点的指针。
B树索引适用于范围查询,可以高效地支持等值查询、范围查询和排序。
B树索引有以下特点:-能够平衡地处理随机和顺序访问,适用于高并发的读写操作。
-支持多列索引,可以根据多个列进行查询。
-适用于存储大量数据的表,可以高效地支持范围查询。
-可以使用前缀索引,用于减少索引的大小和提高查询性能。
-适用于高优先级的查询,如唯一索引和主键索引,可以提高查询速度。
2.哈希索引哈希索引使用哈希算法将键值映射到一个哈希表中,每个哈希表中包含键值对。
哈希索引适用于等值查询,但不支持范围查询和排序。
因此,哈希索引在MySQL中的使用场景相对较少。
哈希索引有以下特点:-适用于等值查询,可以高效地支持等值查询。
-不支持范围查询、排序和部分匹配查询。
-适用于高并发的读写操作,因为哈希索引的读写性能高。
-对于较小的表和较频繁的查询,可以提供更快的查询速度。
3.全文索引全文索引用于包含文本数据的列,如文章内容、博客正文等。
全文索引可以在文本中关键字,而不是完全匹配。
MySQL提供了Full-Text功能,可以高效地进行全文索引。
全文索引有以下特点:-适用于需要在文本数据中进行模糊匹配的查询。
-支持关键字和全文。
-可以设置的匹配程度和权重。
-支持布尔运算表达式,可以组合多个关键字进行查询。
-可以根据文本的相关性进行排序。
4.空间索引空间索引用于存储和查询包含空间数据的列,如地理位置、二维坐标等。
MySQL提供了R-Tree索引来支持空间数据的存储和查询。
空间索引有以下特点:-适用于需要高效地进行空间数据查询的表。
-支持范围查询、最近邻查询和距离查询。
数据库字段类型选择原则与技巧
数据库字段类型选择原则与技巧在设计和创建数据库时,选择适当的字段类型是至关重要的。
字段类型会直接影响数据库的性能、存储和可扩展性。
本文将介绍一些常见的数据库字段类型,并提供选择原则和技巧,以帮助开发人员在设计数据库时做出明智的决策。
1. 字符串类型在数据库中存储文本数据通常需要选择适当的字符串类型。
最常见的字符串类型是CHAR、VARCHAR和TEXT。
- CHAR:固定长度的字符串类型。
当存储的数据的长度是固定的或者非常接近固定的时候,CHAR是一个不错的选择。
例如,存储国家或地区的代码时,通常是两个字符的固定长度。
- VARCHAR:可变长度的字符串类型。
VARCHAR通常用于存储长度不固定的文本数据。
它可以根据存储的数据自动调整长度。
对于存储用户输入的数据,如用户名、电子邮件地址等,使用VARCHAR更为合适。
- TEXT:用于存储大段文本数据的字符串类型。
当需要存储较大的文本数据时,TEXT是一个不错的选择。
然而,需要注意的是,TEXT类型会占用更多的存储空间和处理时间。
2. 数字类型在数据库中存储数值类型的数据时,需要根据数值的范围和精度选择适当的数据类型。
常见的数字类型有INT、BIGINT、FLOAT和DECIMAL。
- INT:用于存储整数类型的数据。
INT适用于存储整数数据,其范围通常从-2147483648到2147483647。
- BIGINT:用于存储较大整数类型的数据。
如果需要存储超过INT范围的整数数据,BIGINT则是一个较好的选择。
- FLOAT:用于存储浮点数类型的数据。
FLOAT适合存储具有小数部分的数值。
然而,需要注意的是,FLOAT类型在精度上有一定的限制。
- DECIMAL:用于存储高精度数值类型的数据。
DECIMAL可以存储更加精确的数值,具有更高的精度。
在需要计算金额和货币值等情况下,DECIMAL通常是更好的选择。
3. 日期和时间类型在数据库中存储日期和时间相关的数据时,需要选择合适的日期和时间类型。
mysql 列类型
MySQL 列类型概述MySQL支持多种列类型:数值类型、日期/时间类型和字符串(字符)类型。
几种列类型描述使用了下述惯例:M 表示最大显示宽度,最大有效显示宽度是255;D 适用于浮点和定点类型,并表示小数点后面的位数。
最大可能的值是30,但不应大于M-2。
方括号([])表示可选部分。
1、数值类型概述如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性。
SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一个别名。
在整数列定义中,SERIAL DEFAULT VALUE是NOT NULL AUTO_INCREMENT UNIQUE的一个别名。
类型范围说明:类型字节最小值最大值TINYINT 1 带符号的 -128 127无符号0 255SMALLINT 2 带符号的 -32768 32767无符号0 65535MEDIUMINT 3 带符号的-8388608 8388607无符号0 16777215INT 4 带符号的-2147483648 2147483647无符号0 4294967295BIGINT 8 带符号的-92233720368547758089223372036854775807 无符号0 184467440737095516151.1、BITBIT[(M)]位字段类型。
M表示每个值的位数,范围为从1到64。
如果M被省略,默认为1。
1.2、INYINTINYINT[(M)] [UNSIGNED] [ZEROFILL]很小的整数。
带符号的范围是-128到127。
无符号的范围是0到255。
1.3、BOOLBOOL,BOOLEAN是TINYINT(1)的同义词。
zero值被视为假。
非zero值视为真。
在将来,将根据标准SQL引入完全布尔类型的处理。
1.4、SMALLINTSMALLINT[(M)] [UNSIGNED] [ZEROFILL]小的整数。
Mysql字段数据类型长度及表类型详细说明
mysql字段数据类型、长度及表类型说明一、MySQL 字段数据类型/长度1、数值类型列类型需要的存储量TINYINT 1 字节SMALLINT 2 个字节MEDIUMINT 3 个字节INT 4 个字节INTEGER 4 个字节BIGINT 8 个字节FLOAT(X) 4 如果X < = 24 或8 如果25 < = X < = 53FLOAT 4 个字节DOUBLE 8 个字节DOUBLE PRECISION 8 个字节REAL 8 个字节DECIMAL(M,D) M字节(D+2 , 如果M < D)NUMERIC(M,D) M字节(D+2 , 如果M < D)MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。
许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补。
INT 类型在MySQL 中支持的5 个主要整数类型是TINYINT,SMALLINT,MEDIUMINT,INT 和BIGINT。
这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。
MySQL 以一个可选的显示宽度指示器的形式对SQL 标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。
例如,指定一个字段的类型为INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。
需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。
万一我们需要对一个字段存储一个超出许可范围的数字,MySQL 会根据允许范围最接近它的一端截短后再进行存储。
还有一个比较特别的地方是,MySQL 会在不合规定的值插入表前自动修改为0。
UNSIGNED(未签署)修饰符规定字段只保存正值。
因为不需要保存数字的正、负符号,可以在储时节约一个“位”的空间。
mysql数据类型
mysql 数据类型2009年07月18日星期六15:57在计算机中数据有两种特征:类型和长度。
所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。
在SQL Server 中每个变量、参数、表达式等都有数据类型。
系统提供的数据类型分为几大类,。
其中,BIGINT、SQL_V ARIANT 和TABLE 是SQL Server 2000 中新增加的3 种数据类型。
下面分类讲述各种数据类型。
4.3.1 整数数据类型整数数据类型是最常用的数据类型之一。
1、INT (INTEGER)INT (或INTEGER)数据类型存储从-2的31次方(-2 ,147 ,483 ,648)到2的31次方-1 (2 ,147 ,483,647)之间的所有正负整数。
每个INT 类型的数据按4 个字节存储,其中1 位表示整数值的正负号,其它31 位表示整数值的长度和大小。
2、SMALLINTSMALLINT 数据类型存储从-2的15次方(-32,768)到2的15次方-1(32 ,767 )之间的所有正负整数。
每个SMALLINT 类型的数据占用2 个字节的存储空间,其中1 位表示整数值的正负号,其它15 位表示整数值的长度和大小。
3、TINYINTTINYINT数据类型存储从0 到255 之间的所有正整数。
每个TINYINT类型的数据占用1 个字节的存储空间。
4、BIGINTBIGINT 数据类型存储从-2^63 (-9 ,223,372,036,854,775,807)到2^63-1(9,223,372,036 ,854 ,775,807)之间的所有正负整数。
每个BIGINT 类型的数据占用8个字节的存储空间。
4.3.2 浮点数据类型浮点数据类型用于存储十进制小数。
浮点数值的数据在SQL Server 中采用上舍入(Round up 或称为只入不舍)方式进行存储。
所谓上舍入是指,当(且仅当)要舍入的数是一个非零数时,对其保留数字部分的最低有效位上的数值加1 ,并进行必要的进位。
10分钟梳理MySQL核心知识点
10分钟梳理MySQL核心知识点今天我们用10分钟,重点梳理一遍以下几方面:•数据库知识点汇总;•数据库事务特性和隔离级别;•详解关系型数据库、索引与锁机制;•数据库调优与最佳实践;•面试考察点及加分项。
一、数据库的不同类型1.常用的关系型数据库•Oracle:功能强大,主要缺点就是贵•MySQL:互联网行业中最流行的数据库,这不仅仅是因为MySQL的免费。
可以说关系数据库场景中你需要的功能,MySQL都能很好的满足,后面详解部分会详细介绍MySQL的一些知识点•MariaDB:是MySQL的分支,由开源社区维护,MariaDB虽然被看作MySQL的替代品,但它在扩展功能、存储引擎上都有非常好的改进•PostgreSQL:也叫PGSQL,PGSQL类似于Oracle的多进程框架,可以支持高并发的应用场景,PG几乎支持所有的SQL标准,支持类型相当丰富。
PG更加适合严格的企业应用场景,而MySQL更适合业务逻辑相对简单、数据可靠性要求较低的互联网场景。
2.NoSQL数据库(非关系型数据库)•Redis:提供了持久化能力,支持多种数据类型。
Redis适用于数据变化快且数据大小可预测的场景。
•MongoDB:一个基于分布式文件存储的数据库,将数据存储为一个文档,数据结构由键值对组成。
MongoDB比较适合表结构不明确,且数据结构可能不断变化的场景,不适合有事务和复杂查询的场景。
•HBase:建立在HDFS,也就是Hadoop文件系统之上的分布式面向列的数据库。
类似于谷歌的大表设计,HBase可以提供快速随机访问海量结构化数据。
在表中它由行排序,一个表有多个列族以及每一个列族可以有任意数量的列。
HBase依赖HDFS可以实现海量数据的可靠存储,适用于数据量大,写多读少,不需要复杂查询的场景。
•Cassandra:一个高可靠的大规模分布式存储系统。
支持分布式的结构化Key-value存储,以高可用性为主要目标。
mysql数据库设计原则
MySQL数据库设计原则一、概述MySQL是一种开源的关系型数据库管理系统,被广泛应用于各种规模的应用程序中。
在设计MySQL数据库时,遵循一些重要的原则可以提高数据库的性能、可靠性和可维护性。
本文将介绍一些常用的MySQL数据库设计原则,以帮助开发人员设计出高效、稳定的数据库。
二、数据规范化数据规范化是数据库设计的基本原则之一,它通过将数据分解为更小的、更具体的表来消除冗余数据,并通过外键建立表之间的关系。
以下是一些常用的数据规范化原则:2.1 第一范式(1NF)第一范式要求每个数据库表的每个列都是原子的,即不可再分解的最小数据单元。
例如,一个顾客表应该有独立的列存储姓名、地址、邮编等信息,而不是将这些信息存储在一个列中。
2.2 第二范式(2NF)第二范式要求每个非主键列都完全依赖于主键。
如果一个表中存在复合主键,那么非主键列必须依赖于所有的主键列。
如果非主键列只依赖于部分主键列,那么就应该将这些非主键列分离出来形成一个新的表。
2.3 第三范式(3NF)第三范式要求每个非主键列都不传递依赖于主键。
如果一个非主键列依赖于另一个非主键列,那么就应该将这个非主键列分离出来形成一个新的表。
三、索引设计索引是提高数据库查询性能的关键。
合理的索引设计可以加快查询速度,减少数据库的IO负载。
以下是一些索引设计原则:3.1 选择合适的索引列选择合适的索引列是索引设计的关键。
通常情况下,主键列和经常用于查询的列都是好的索引选择。
另外,对于经常用于排序和分组的列,也可以考虑创建索引。
3.2 避免创建过多的索引虽然索引可以提高查询性能,但是创建过多的索引会增加数据库的维护成本,并且会降低写入性能。
因此,在设计索引时,需要权衡查询性能和写入性能。
3.3 使用复合索引复合索引是由多个列组成的索引,可以提高查询的效率。
在创建复合索引时,需要考虑查询的频率和列的顺序,以及列的选择性。
四、表关系设计表关系设计是数据库设计的重要组成部分。
Mysql数据库设计规范
Mysql数据库设计规范Mysql数据库规范Version 1.0创建时间2016-08-011.命名规范(1)库名、表名、字段名必须使用小写字母,并采用下划线分割。
(2)库名、表名、字段名尽量不要超过32个字符。
(3)库名、表名、字段名必须见名知意。
命名与业务、产品线等相关联。
(4)库名、表名、字段名禁止使用MySQL保留字。
(保留字列表见2.基础规范(1)使用INNODB存储引擎。
(2)表字符集使用UTF8字符集,校验字符集使用utf8_general_ci(3)所有表都需要添加注释;除主键外的其他字段都需要增加注释。
(4)禁止在数据库中存储图片、文件等大数据。
(5)每张表数据量建议控制在5000W以内。
(6)禁止在线上做数据库压力测试。
(7)禁止从测试、开发环境直连线上数据库。
3.库表设计(1)制止利用分区表。
(2)将大字段、访问频率低的字段拆分到单独的表中存储,星散冷热数据。
(3)采用合适的分库分表战略。
例如千库十表、十库百表等。
4.字段设计(1)建议利用UNSIGNED存储非负数值。
(2)建议利用INT UNSIGNED存储IPV4。
(3)用DECIMAL代替FLOAT和DOUBLE存储精确浮点数。
例如与泉币、金融相关的数据。
(4)INT类型固定占用4字节存储,(5)区分使用TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT数据类型。
例如取值范围为0-80时,使用TINYINT UNSIGNED。
(6)强烈建议利用XXX来代替ENUM类型。
(7)尽可能不利用TEXT、BLOB类型。
(8)禁止在数据库中存储明文密码。
(9)使用尽可能小的VARCHAR字段。
VARCHAR(N)中的N表示字符数而非字节数。
(10)区分使用DATETIME和TIMESTAMP。
存储年使用YEAR类型。
存储日期使用DATE 类型。
存储时间(精确到秒)建议使用TIMESTAMP类型。
(11)所有字段均定义为NOT NULL。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. MYSQL 5数据类型,长度范围1.1数值类型MySQL支持所有标准SQL数值数据类型.这些类型包括严格数值数据类型(INTEGER,SMALLINT,DECIMAL和NUMERIC),以及近似数值数据类型 (FLOAT,REAL 和DOUBLE PRECISION).关键字INT是INTEGER的同义词,关键字DEC是DECIMAL 的同义词.BIT 数据类型保存位字段值,并且支持MyISAM,MEMORY,InnoDB和BDB表.作为SQL标准的扩展,MySQL也支持整数类型 TINYINT,MEDIUMINT和BIGINT.下面的表显示了需要的每个整数类型的存储和范围.MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4)).该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度.显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示.当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替.例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004.请注意如果在整数列保存超过显示宽度的一个值,当MySQL为复杂联接生成临时表时会遇到问题,因为在这些情况下MySQL相信数据适合原列宽度.所有整数类型可以有一个可选(非标准)属性UNSIGNED.当你想要在列内只允许非负数和该列需要较大的上限数值范围时可以使用无符号值.浮点和定点类型也可以为UNSIGNED.同数类型,该属性防止负值保存到列中.然而,与整数类型不同的是,列值的上范围保持不变.如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性.对于浮点列类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节.FLOAT类型用于表示近似数值数据类型.SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围).MySQL还支持可选的只用于确定存储大小的精度规定.0到23的精度对应FLOAT 列的4字节单精度.24到53的精度对应DOUBLE列的8字节双精度.MySQL允许使用非标准语法:FLOAT(M,D)或 REAL(M,D)或DOUBLE PRECISION(M,D).这里,"(M,D)"表示该值一共显示M位整数,其中D位位于小数点后面.例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999.MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001.MySQL 将DOUBLE视为DOUBLE PRECISION(非标准扩展)的同义词.MySQL还将REAL 视为DOUBLE PRECISION(非标准扩展)的同义词,除非SQL服务器模式包括REAL_AS_FLOAT选项.为了保证最大可能的可移植性,需要使用近似数值数据值存储的代码应使用FLOAT或DOUBLE PRECISION,不规定精度或位数.DECIMAL和NUMERIC类型在MySQL中视为相同的类型.它们用于保存必须为确切精度的值,例如货币数据.当声明该类型的列时,可以(并且通常要)指定精度和标度;例如:salary DECIMAL(5,2)在该例子中,5是精度,2是标度.精度表示保存值的主要位数,标度表示小数点后面可以保存的位数.在MySQL 5.1中以二进制格式保存DECIMAL和NUMERIC值.标准SQL要求salary列能够用5位整数位和两位小数保存任何值.因此,在这种情况下可以保存在salary列的值的范围是从-999.99到999.99.在标准SQL中,语法DECIMAL(M)等价于 DECIMAL(M,0).同样,语法DECIMAL等价于DECIMAL(M,0),可以通过计算确定M的值.在MySQL 5.1中支持DECIMAL和NUMERIC数据类型的变量形式.M默认值是10.DECIMAL或NUMERIC的最大位数是65,但具体的DECIMAL或NUMERIC列的实际范围受具体列的精度或标度约束.如果此类列分配的值小数点后面的位数超过指定的标度允许的范围,值被转换为该标度.(具体操作与操作系统有关,但一般结果均被截取到允许的位数).BIT数据类型可用来保存位字段值.BIT(M)类型允许存储M位值.M范围为1到64.要指定位值,可以使用b'value'符.value是一个用0和1编写的二进制值.例如,b'111'和 b'100000000'分别表示7和128.参见9.1.5节,"位字段值".如果为BIT(M)列分配的值的长度小于M位,在值的左边用0填充.例如,为BIT(6)列分配一个值b'101',其效果与分配b'000101'相同.当要在一个数值列内保存一个超出该列允许范围的值时,MySQL的操作取决于此时有效的SQL模式.如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值.但是,如果模式设置为traditional("严格模式"),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败.参见5.3.2节,"SQL服务器模式".如果INT列是UNSIGNED,列范围的大小相同,但其端点会变为到0和4294967295.如果你试图保存-9999999999和 9999999999,以非严格模式保存到列中的值是0和4294967296.如果在浮点或定点列中分配的值超过指定(或默认)精度和标度规定的范围,MySQL以非严格模式保存表示范围相应端点的值.当MySQL没有工作在严格模式时,对于ALTER TABLE,LOAD DATA INFILE,UPDATE 和多行INSERT语句,由于裁剪发生的转换将报告为警告.当MySQL工作在严格模式时,这些语句将失败,并且部分或全部值不会插入或更改,取决于是否表为事务表和其它因素.这里将数字类型按照分类方法分为三类:整数类,小数类和数字类.我所谓的"数字类",就是指 DECIMAL 和 NUMERIC,它们是同一种类型.它严格的说不是一种数字类型,因为他们实际上是将数字以字符串形式保存的;他的值的每一位 (包括小数点) 占一个字节的存储空间,因此这种类型耗费空间比较大.但是它的一个突出的优点是小数的位数固定,在运算中不会"失真",所以比较适合用于"价格","金额"这样对精度要求不高但准确度要求非常高的字段.小数类,即浮点数类型,根据精度的不同,有 FLOAT 和 DOUBLE 两种.它们的优势是精确度,FLOAT 可以表示绝对值非常小,小到约 1.17E-38 (0.000...0117,小数点后面有 37 个零) 的小数,而 DOUBLE 更是可以表示绝对值小到约2.22E-308 (0.000...0222,小数点后面有 307 个零) 的小数.FLOAT 类型和DOUBLE 类型占用存储空间分别是 4 字节和 8 字节.如果需要用到小数的字段,精度要求不高的,当然用 FLOAT 了.可是说句实在话,我们"民用"的数据,哪有要求精度那么高的呢?这两种类型至今我没有用过――我还没有遇到适合于使用它们的事例.用的最多的,最值得精打细算的,是整数类型.从只占一个字节存储空间的TINYINT 到占 8 个字节的 BIGINT,挑选一个"够用"并且占用存储空间最小的类型是设计数据库时应该考虑的.TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT 占用存储空间分别为 1 字节,2 字节,3 字节,4 字节和 8 字节,就无符号的整数而言,这些类型能表示的最大整数分别为 255,65535,16777215,4294967295 和 18446744073709551615.如果用来保存用户的年龄 (举例来说,数据库中保存年龄是不可取的),用 TINYINT 就够了;九城的《纵横》里,各项技能值,用SMALLINT 也够了;如果要用作一个肯定不会超过 16000000 行的表的AUTO_INCREMENT 的 IDENTIFY 字段,当然用 MEDIUMINT 不用 INT,试想,每行节约一个字节,16000000 行可以节约 10 兆多.1.2日期和时间类型表示时间值的DATE和时间类型为DATETIME,DATE,TIMESTAMP,TIME和YEAR.每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值.TIMESTAMP类型有专有的自动更新特性,将在后面描述.如果试图插入一个不合法的日期,MySQL将给出警告或错误.可以使用ALLOW_INVALID_DATES SQL模式让MySQL接受某些日期,例如'1999-11-31'.当你想要保存一个"可能错误的"用户已经在数据库中指定(例如,以web形式)用于将来处理的值时很有用.在这种模式下,MySQL只验证月范围为从0到12,日范围为从0到31.这些范围可以包括零,因为MySQL允许在DATE或 DATETIME列保存日/月和日是零的日期.这在应用程序需要保存一个你不知道确切日期的生日时非常有用.在这种情况下,只需要将日期保存为 '1999-00-00'或'1999-01-00'.如果保存此类日期,DATE_SUB()或DATE_ADD等需要完整日期的函数不会得到正确的结果.(如果你不想在日期中出现零,可以使用NO_ZERO_IN_DATE SQL模式).MySQL还允许将'0000-00-00'保存为"伪日期"(如果不使用NO_ZERO_DATE SQL 模式).这在某些情况下比使用NULL值更方便(并且数据和索引占用的空间更小).将 sql_mode系统变量设置为相应模式值,可以更确切你想让MySQL支持哪种日期.参见5.3.2节,"SQL服务器模式".当使用日期和时间类型时应记住以下几点:· MySQL以标准输出格式检索给定日期或时间类型的值,但它尽力解释你指定的各种输入值格式(例如,当你指定一个分配给或与日期或时间类型进行比较的值时).只支持下面章节中描述的格式.期望你能提供有效值.如果你使用其它格式的值会发生意想不到的结果.· 包含两位年值的日期会令人模糊,因为世纪不知道.MySQL使用以下规则解释两位年值:o 70-99范围的年值转换为1970-1999.o 00-69范围的年值转换为2000-2069.· 尽管MySQL尝试解释几种格式的值,日期总是以年-月-日顺序(例如,'98-09-04'),而不是其它地方常用的月-日-年或日-月-年顺序(例如,'09-04-98','04-09-98').· 如果值用于数值上下文中,MySQL自动将日期或时间类型的值转换为数字,反之亦然.· 当 MySQL遇到一个日期或时间类型的超出范围或对于该类型不合法的值时(如本节开始所描述),它将该值转换为该类的"零"值.一个例外是超出范围的TIME值被裁剪到TIME范围的相应端点.下面的表显示了各类"零"值的格式.请注意如果启用NO_ZERO_DATE SQL模式,使用这些值会产生警告.1.3 String类型字符串类型指CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM和 SET.该节描述了这些类型如何工作以及如何在查询中使用这些类型.CHAR和VARCHAR类型类似,但它们保存和检索的方式不同.它们的最大长度和是否尾部空格被保留等方面也不同.在存储或检索过程中不进行大小写转换.CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数.例如,CHAR(30)可以占用30个字符.CHAR列的长度固定为创建表时声明的长度.长度可以为从0 到255的任何值.当保存CHAR值时,在它们的右边填充空格以达到指定的长度.当检索到CHAR值时,尾部的空格被删除掉.在存储或检索过程中不进行大小写转换.VARCHAR列中的值为可变长字符串.长度可以指定为0到65,535之间的值.(VARCHAR的最大有效长度由最大行大小和使用的字符集确定.整体最大长度是65,532字节).同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节).VARCHAR值保存时不进行填充.当值保存和检索时尾部的空格仍保留,符合标准SQL.如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合.如果被裁掉的字符不是空格,则会产生一条警告.如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入.下面的表显示了将各种字符串值保存到 CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:请注意上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度不的值不保存,并且会出现错误.从CHAR(4)和VARCHAR(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;BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串.也就是说,它们包含字节字符串而不是字符字符串.这说明它们没有字符集,并且排序和比较基于列值字节的数值值.BINARY和 VARBINARY允许的最大长度一样,如同CHAR和VARCHAR,不同的是BINARY和VARBINARY的长度是字节长度而不是字符长度.BINARY 和VARBINARY数据类型不同于CHAR BINARY和VARCHAR BINARY数据类型.对于后一种类型,BINARY属性不会将列视为二进制字符串列.相反,它致使使用列字符集的二元校对规则,并且列自身包含非二进制字符字符串而不是二进制字节字符串.例如CHAR(5) BINARY被视为CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin,假定默认字符集是latin1.这不同于BINARY(5),它保存5字节二进制字符串,没有字符集或校对规则.当保存BINARY值时,在它们右边填充值以达到指定长度.填充值是0x00(零字节).插入值时在右侧添加0x00 on,并且选择时不删除尾部的字节.比较时所有字节很重要,包括ORDER BY和DISTINCT操作.比较时0x00字节和空格是不同的,0x00<空格.例如:对于一个BINARY(3)列,当插入时 'a' 变为 'a �'.'a�'插入时变为'a��'.当选择时两个插入的值均不更改.对于VARBINARY,插入时不填充字符,选择时不裁剪字节.比较时所有字节很重要,包括ORDER BY和DISTINCT操作.比较时0x00字节和空格是不同的,0x00<空格.对于尾部填充字符被裁剪掉或比较时将它们忽视掉的情形,如果列的索引需要唯一的值,在列内插入一个只是填充字符数不同的值将会造成复制键值错误.如果你计划使用这些数据类型来保存二进制数据并且需要检索的值与保存的值完全相同,应考虑前面所述的填充和裁剪特征.下面的例子说明了用0x00填充的BINARY值如何影响列值比较:mysql> CREATE TABLE t (c BINARY(3));Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO t SET c = 'a';Query OK, 1 row affected (0.01 sec)mysql> SELECT HEX(c), c = 'a', c = 'a��' from t;+--------+---------+-------------+| HEX(c) | c = 'a' | c = 'a��' |+--------+---------+-------------+| 610000 | 0 | 1 |+--------+---------+-------------+1 row in set (0.09 sec)如果检索的值必须与指定进行存储而没有填充的值相同,最好使用BLOB数据类型.BLOB是一个二进制大对象,可以容纳可变数量的数据.有4种BLOB类型:TINYBLOB,BLOB,MEDIUMBLOB和LONGBLOB.它们只是可容纳值的最大长度不同.有4种TEXT类型:TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT.这些对应4种BLOB 类型, 有相同的最大长度和存储需求.BLOB 列被视为二进制字符串(字节字符串).TEXT列被视为非二进制字符串(字符字符串).BLOB列没有字符集,并且排序和比较基于列值字节的数值值.TEXT 列有一个字符集,并且根据字符集的校对规则对值进行排序和比较.在TEXT或BLOB列的存储或检索过程中,不存在大小写转换.当未运行在严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值值,值被截取以保证适合.如果截掉的字符不是空格,将会产生一条警告.使用严格SQL模式,会产生错误,并且值将被拒绝而不是截取并给出警告.在大多数方面,可以将BLOB列视为能够足够大的VARBINARY列.同样,可以将TEXT列视为VARCHAR列.BLOB和TEXT在以下几个方面不同于VARBINARY和VARCHAR:· 当保存或检索BLOB和TEXT列的值时不删除尾部空格.(这与VARBINARY和VARCHAR列相同).请注意比较时将用空格对TEXT进行扩充以适合比较的对象,正如CHAR和VARCHAR.· 对于BLOB和TEXT列的索引,必须指定索引前缀的长度.对于CHAR和VARCHAR,前缀长度是可选的.· BLOB和TEXT列不能有默认值.LONG和LONG VARCHAR对应MEDIUMTEXT数据类型.这是为了保证兼容性.如果TEXT 列类型使用BINARY属性,将为列分配列字符集的二元校对规则.MySQL 连接程序/ODBC将BLOB值定义为LONGVARBINARY,将TEXT值定义为LONGVARCHAR.由于BLOB和TEXT值可能会非常长,使用它们时可能遇到一些约束:· 当排序时只使用该列的前max_sort_length个字节.max_sort_length的默认值是1024;该值可以在启动mysqld服务器时使用--max_sort_length选项进行更改.运行时增加 max_sort_length的值可以在排序或组合时使更多的字节有意义.任何客户端可以更改其会话max_sort_length变量的值:mysql> SET max_sort_length = 2000;mysql> SELECT id, comment FROM tbl_name-> ORDER BY comment;当你想要使超过max_sort_length的字节有意义,对含长值的BLOB或TEXT列使用GROUP BY或ORDER BY的另一种方式是将列值转换为固定长度的对象.标准方法是使用SUBSTRING函数.例如,下面的语句对comment列的2000个字节进行排序:mysql> SELECT id, SUBSTRING(comment,1,2000) FROM tbl_name-> ORDER BY SUBSTRING(comment,1,2000);· BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定.你可以通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序.例如,可以使用 mysql和mysqldump来更改客户端的max_allowed_packet值.参见7.5.2节,"调节服务器参数",8.3 节,"mysql:MySQL命令行工具"和8.8节,"mysqldump:数据库备份程序".每个BLOB或TEXT值分别由内部分配的对象表示.这与其它列类型形成对比,后者是当打开表时为每1列分配存储引擎.不要以为字符类型就是 CHAR,CHAR 和 VARCHAR 的区别在于 CHAR 是固定长度,只要你定义一个字段是 CHAR(10),那么不论你存储的数据是否达到了 10 个字节,它都要占去 10 个字节的空间;而 VARCHAR 则是可变长度的,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过 10 个字符,把它定义为VARCHAR(10) 是最合算的,VARCHAR 类型的占用空间是它的值的实际长度 +1.为什么要 +1 呢?这一个字节用于保存实际使用了多大的长度.从这个 +1 中也应该看到,如果一个字段,它的可能值最长是 10 个字符,而多数情况下也就是用到了 10 个字符时,用 VARCHAR 就不合算了:因为在多数情况下,实际占用空间是11 个字节,比用 CHAR(10) 还多占用一个字节.举个例子,就是一个存储股票名称和代码的表,股票名称绝大部分是四个字的,即 8 个字节;股票代码,上海的是六位数字,深圳的是四位数字.这些都是固定长度的,股票名称当然要用 CHAR(8);股票代码虽然是不固定长度,但如果使用VARCHAR(6),一个深圳的股票代码实际占用空间是 5 个字节,而一个上海的股票代码要占用 7 个字节!考虑到上海的股票数目比深圳的多,那么用 VARCHAR(6) 就不如 CHAR(6) 合算了.虽然一个 CHAR 或 VARCHAR 的最大长度可以到 255,我认为大于 20 的 CHAR 是几乎用不到的――很少有大于 20 个字节长度的固定长度的东东吧?不是固定长度的就用 VARCHAR.大于 100 的 VARCHAR 也是几乎用不到的――比这更大的用 TEXT 就好了.TINYTEXT,最大长度为 255,占用空间也是实际长度 +1;TEXT,最大长度 65535,占用空间是实际长度 +2;MEDIUMTEXT,最大长度 16777215,占用空间是实际长度 +3;LONGTEXT,最大长度 4294967295,占用空间是实际长度+4.为什么 +1,+2,+3,+4?你要是还不知道就该打 PP 了.这些可以用在论坛啊,新闻啊,什么的,用来保存文章的正文.根据实际情况的不同,选择从小到大的不同类型.ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值.在某些情况下,ENUM值也可以为空字符串('')或NULL:· 如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值.该字符串与"普通"空字符串不同,该字符串有数值值0.后面有详细讨论.· 如果将ENUM列声明为允许NULL,NULL值则为该列的一个有效值,并且默认值为NULL.如果ENUM列被声明为NOT NULL,其默认值为允许的值列的第1个元素.每个枚举值有一个索引:· 来自列规定的允许的值列中的值从1开始编号.· 空字符串错误值的索引值是0.这说明你可以使用下面的SELECT语句来找出分配了非法ENUM值的行:· mysql> SELECT * FROM tbl_name WHERE enum_col=0;· NULL值的索引是NULL.例如,定义为ENUM的列('one','two','three')可以有下面所示任何值.还显示了每个值的索引:枚举最多可以有65,535个元素.当创建表时,ENUM成员值的尾部空格将自动被删除.当检索时,保存在ENUM列的值使用列定义中所使用的大小写来显示.请注意可以为 ENUM列分配字符集和校对规则.对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写.如果在数值上下文中检索一个ENUM 值,将返回列值的索引.例如,你可以这样从ENUM列搜索数值值:mysql> SELECT enum_col+0 FROM tbl_name;如果将一个数字保存到ENUM列,数字被视为索引,并且保存的值是该索引对应的枚举成员.(但是,这不适合LOAD DATA,它将所有输入视为字符串).不建议使用类似数字的枚举值来定义一个ENUM列,因为这很容易引起混淆.例如,下面的列含有字符串值 '0','1'和'2'的枚举成员,但数值索引值为1,2和3:numbers ENUM('0','1','2')根据枚举成员在列定义中列出的顺序对ENUM值进行排序.(换句话说,ENUM值根据索引编号进行排序).例如,对于ENUM('a','b'),'a'排在'b'前面,但对于ENUM('b','a'),'b'排在'a'前面.空字符串排在非空字符串前面,并且NULL值排在所有其它枚举值前面.要想防止意想不到的结果,按字母顺序规定ENUM列.还可以使用GROUP BY CAST(col AS CHAR)或GROUP BY CONCAT(col)来确保按照词汇对列进行排序而不是用索引数字.如果你想要确定一个ENUM列的所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE enum_col,并解析输出中第2列的ENUM定义.2.字段列类型存储条件说明根据类别列出了MySQL支持的每个列类型的存储需求.MyISAM表中行的最大大小为65,534字节. 每个BLOB和TEXT列账户只占其中的5至9个字节.如果MyISAM表包括变长列类型,记录格式也是可变长度.当创建表时,在某些条件下,MySQL可以将一个列从变长类型改为固定长度的类型或反之亦然.数值类型存储规则DECIMAL(和NUMERIC)的存储需求与具体版本有关:使用二进制格式将9个十进制(基于10)数压缩为4个字节来表示DECIMAL列值.每个值的整数和分数部分的存储分别确定.每个9位数的倍数需要4个字节,并且"剩余的"位需要4个字节的一部分.下表给出了超出位数的存储需求:日期和时间类型的存储需求The storage requirements shown in the table arise from the way that MySQL represents temporal values:DATE: A three-byte integer packed as DD + MM×32 + YYYY×16×32TIME: A three-byte integer packed as DD×24×3600 + HH×3600 + MM×60 + SSDATETIME: Eight bytes:A four-byte integer packed as YYYY×10000 + MM×100 + DDA four-byte integer packed as HH×10000 + MM×100 + SSTIMESTAMP: A four-byte integer representing seconds UTC since the epoch ('1970-01-01 00:00:00' UTC)YEAR: A one-byte integer字符串类型的存储需求VARCHAR,BLOB 和TEXT类是变长类型.每个类型的存储需求取决于列值的实际长度(用前面的表中的L表示),而不是该类型的最大可能的大小.例如,VARCHAR(10)列可以容纳最大长度为10的字符串.实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节.对于字符串 'abcd',L是4,存储需要5个字节.对于CHAR,VARCHAR和TEXT类型,前面的表中的值L和M应解释为字符数目,并且列定义中的这些类型的长度表示字符数目.例如,要想保存一个TINYTEXT值需要L字符+ 1个字节.要想计算用于保存具体 CHAR,VARCHAR或者TEXT列值的字节数,需要考虑该列使用的字符集.在具体情况中,当使用Unicode时,必须记住所有Unicode字符使用相同的字节数.为了细分用于不同类Unicode字符使用的存储,注释:VARCHAR列的有效最大长度为65,532字符NDBCLUSTER 引擎只支持固定宽度的列.这说明MySQL簇中的表中的VARCHAR列的行为如同类型CHAR(不同的是每个记录仍然有一个额外字节空间).例如,在Cluster表中,声明为VARCHAR(100)的列中的每个记录存储时将占用101个字节,无论实际存储的记录中的字符串的长度为多少.BLOB 和TEXT类需要 1,2,3或者4个字节来记录列值的长度,取决于该类的最大可能的长度.在NDB Cluster存储引擎中,TEXT和BLOB列的实施是不同的,其中TEXT列中的每个记录由两个单独部分组成.一个是固定大小(256字节),并且实际上保存在原表中.另一个包括超出256字节的任何数据,保存在隐含的表中.第2个表中的记录总是2,000字节长.这说明如果size<= 256,TEXT列的大小为256(其中size 表示记录的大小);否则,大小是256 +size+(2000–(size–256)%2000).ENUM 对象的大小由不同的枚举值的数目确定.枚举用一个字节,可以有255个可能的值.当枚举的值位于256和65,535之间时,用两个字节.参见 11.4.4节,"ENUM类型".SET对象的大小由不同的set成员的数量确定.如果set大小是N,对象占(N+7)/8个字节,四舍五入到1,2,3,4或者8个字节.SET最多可以有64个成员.3.选择正确的列类型为了优化存储,在任何情况下均应使用最精确的类型.例如,如果列的值的范围为从1到99999,若使用整数,则MEDIUMINT UNSIGNED是好的类型.在所有可以表示该列值的类型中,该类型使用的存储最少.用精度为65位十进制数(基于10)对DECIMAL 列进行所有基本计算(+,-,*,/).使用双精度操作对DECIMAL值进行计算.如果准确度不是太重要或如果速度为最高优先级,DOUBLE类型即足够了.为了达到高精度,可以转换到保存在BIGINT中的定点类型.这样可以用64位整数进行所有计算,根据需要将结果转换回浮点值.4.使用来自其他数据库引擎的列类型为了使用由其它卖方编写的SQL执行代码,MySQL按照下表所示对列类型进行映射.通过这些映射,可以很容易地从其它数据库引擎将表定义导入到MySQL中:。