您的位置:首页 > 数据库 > MySQL

MySQL(四)之MySQL数据类型

2015-08-30 22:51 549 查看
一、数据字典
数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明。 数据字典(Data dictionary)是一种用户可以访问的记录数据库和应用程序元数据的目录。主动数据字典是指在对数据库或应用程序结构进行修改时,其内容可以由DBMS自动更新的数据字典。被动数据字典是指修改时必须手工更新其内容的数据字典。数据字典是关于数据的信息的集合,也就是对数据库中包含的所有元数据的定义的集合。

1、简介
数据字典(data dictionary)是对于数据模型中的数据对象或者项目的描述的集合,这样做有利于程序员和其他需要参考的人。分析一个用户交换的对象系统的第一步就是去辨别每一个对象,以及它与其他对象之间的关系。这个过程称为数据建模,结果产生一个对象关系图。当每个数据对象和项目都给出了一个描述性的名字之后,它的关系再进行描述(或者是成为潜在描述关系的结构中的一部分),然后再描述数据的类型(例如文本还是图像,或者是二进制数值),列出所有可能预先定义的数值,以及提供简单的文字性描述。这个集合被组织成书的形式用来参考,就叫做数据字典。
当开发用到数据模型的程序时,数据字典可以帮助你理解数据项适合结构中的哪个地方,它可能包含什么数值,以及数据项基本上表示现实世界中的什么意思。例如,一家银行或者是一个银行组织可能对客户银行业涉及的数据对象进行建模。他们需要给银行程序员提供数据字典。这个数据字典就描述了客户银行业中的数据模型每一个数据项(例如,“账户持有人”和“可用信用”)。

2、作用
数据字典最重要的作用是作为分析阶段的工具。任何字典最重要的用途都是供人查询对不了解的条目的解释,在结构化分析中,数据字典的作用是给数据流图上每个成分加以定义和说明。换句话说,数据流图上所有的成分的定义和解释的文字集合就是数据字典,而且在数据字典中建立的一组严密一致的定义很有助于改进分析员和用户的通信。 数据库数据字典不仅是每个数据库的中心,而且对每个用户也是非常重要的信息。用户可以用SQL语句访问数据库数据字典。

二、元数据
元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的。
元数据是关于数据的组织、数据域及其关系的信息,简言之,元数据就是关于数据的数据。

1、特点
元数据是关于数据的结构化的数据,它不一定是数字形式的,可来自不同的资源。

元数据是与对象相关的数据,此数据使其潜在的用户不必先具备对这些对象的存在和特征的完整认识。

元数据是对信息包裹(Information Package)的编码的描述。

元数据包含用于描述信息对象的内容和位置的数据元素集,促进了网络环境中信息对象的发现和检索。

元数据不仅对信息对象进行描述,还能够描述资源的使用环境、管理、加工、保存和使用等方面的情况。

在信息对象或系统的生命周期中自然增加元数据。

元数据常规定义中的“数据”是表示事务性质的符号,是进行各种统计、计算、科学研究、技术设计所依据的数值,或是说数字化、公式化、代码化、图表化的信息。

2、元数据内容
基于应用,可以将元数据分成以下的若干种。

数据结构:数据集的名称、关系、字段、约束等;

数据部署:数据集的物理位置;

数据流:数据集之间的流程依赖关系(非参照依赖),包括数据集到另一个数据集的规则;

质量度量:数据集上可以计算的度量;

度量逻辑关系:数据集度量之间的逻辑运算关系;

ETL过程:过程运行的顺序,并行、串行;

数据集快照:一个时间点上,数据在所有数据集上的分布情况;

星型模式元数据:事实表、维度、属性、层次等;

报表语义层:报表指标的规则、过滤条件物理名称和业务名称的对应;

数据访问日志:哪些数据何时被何人访问;

质量稽核日志:何时、何度量被稽核,其结果;

数据装载日志:哪些数据何时被何人装载;

而MySQL保存元数据的库为:mysql、information_schema、performance_schema而后两者对于MySQL的作用相当于Linux系统中/proc目录对于Linux系统的左右。

三、MySQL数据类型
1、分类
整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT

浮点数类型:FLOAT、DOUBLE、DECIMAL

字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB

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

其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等

2、数值型
整型

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)。
浮点型

MySQL数据类型含义
float(m,d)单精度浮点型 8位精度(4字节) m总个数,d小数位
double(m,d)双精度浮点型 16位精度(8字节) m总个数,d小数位
设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。
定点数

浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。 decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。

3、字符型
字符串





char和varchar:
char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。

char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255), 所以varchar(4),存入3个字符将占用4个字节。

char类型的字符串检索速度要比varchar类型的快。

varchar和text:
varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字 节。

text类型不能有默认值。

varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

二进制数据(_Blob)
blob和text存储方式不同,text以文本方式存储,英文存储区分大小写,而blob是以二进制方式存储,不分大小写。

blob存储的数据只能整体读出。

text可以指定字符集,blob不用指定字符集

4、日期时间型
日期时间类型





若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。

5、使用数据类型的一部分建议
在指定数据类型的时候一般是采用从小原则,比如能用TINY INT的最好就不用INT,能用FLOAT类型的就不用DOUBLE类型,这样会对MYSQL在运行效率上提高很大,尤其是大数据量测试条件下。

不需要把数据表设计的太过复杂,功能模块上区分或许对于后期的维护更为方便,慎重出现大杂烩数据表

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

设计数据表结构之前请先想象一下是你的房间,或许结果会更加合理、高效

数据库的最后设计结果一定是效率和可扩展性的折中,偏向任何一方都是欠妥的

四、MySQL数据的修饰符
1、CHAR、VARCHAR和TEXT几种字符型常用的属性修饰符
NOT NULL:非空约束 。

NULL:允许为空 。

DEFAULT 'string':设定默认值,不适用于TEXT类型。

CHARACTER SET '字符集' :设定字符集。

mysql> SHOW VARIABLES LIKE '%char%';  //查看mysql支持的所以字符集
mysql> SHOW CHARACTER SET;         //查看当前主机的字符集
COLLATION '规则':指定排序规则

mysql> SHOW COLLATION;     //查看mysql的排序规则


2、BINARY、VARBINARY和BLOB几种字符型常用的属性修饰符
NOT NULL

NULL

DEFAULT: 不适用于BLOB

3、整型的常用属性修饰符
AUTO_INCREMENT:自动增长。使用前提:非空,且惟一;支持索引,非负值;

UNSIGNED:无符号

NULL

NOT NULL

DEFAULT

4、浮点型常用修饰符
NOT NULL

NULL

DEFAULT

UNSIGNED

5、日期时间型的修饰符
NOT NULL

NULL

DEFAULT

6、ENUM和SET的修饰符
NOT NULL

NULL

DEFAULT 'string'

五、MySQL变量设置
1、支持修改的服务器变量
动态变量:可以MySQL运行时修改

静态变量:必须在配置文件中修改其值,并重启后方能生效;

2、变量有效范围
全局变量:服务器级别,修改之后仅对新建立的会话有效;

会话变量:会话级别,仅对当前会话有效;

注意:新会话建立时,从全局变量中继承各变量;

3、查看服务器变量
mysql> SHOW [{GLOBAL|SESSION}] VARIABLES [LIKE ''];
mysql> SELECT @@{GLOBAL|SESSION}.VARILABLE_NAME;
mysql> SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='SOME_VARIABLE_NAME';
mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='SOME_VARIABLE_NAME';


4、修改服务器变量
修改前提:默认仅管理员有权限修改全局变量。
修改命令:
mysql> SET {GLOBAL|SESSION} VARIABLE_NAME='VALUE';
注意:无论是全局还是会话级别的动态变量修改,在重启mysqld后都会失效;想永久有效,可定义在配置文件中的相应段中[mysqld];
应用举例:
MariaDB [information_schema]> SET SESSION sql_mode='STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)
MariaDB [information_schema]> SELECT * FROM SESSION_VARIABLES WHERE VARIABLE_NAME='sql_mode';
+---------------+-------------------+
| VARIABLE_NAME | VARIABLE_VALUE    |
+---------------+-------------------+
| SQL_MODE      | STRICT_ALL_TABLES |
+---------------+-------------------+
1 row in set (0.00 sec)
MariaDB [information_schema]> SELECT * FROM GLOBAL_VARIABLES WHERE VARIABLE_NAME='sql_mode';
+---------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------+----------------+
| SQL_MODE      |                |
+---------------+----------------+
1 row in set (0.00 sec)
通过上面设置的服务器变量可以发现SET SESSION sql_mode='STRICT_ALL_TABLES';语句仅对当前会话有效,而若要对全局会话有效则要执行SET GLOBAL sql_mode='STRICT_ALL_TABLES';这种全局定义的语句。最后设置为STRICT_ALL_TABLES的作用是:当我们定义char的长度为3,并把sql_mode设置为'STRICT_ALL_TABLES'时,若我们插入的数据长度大于3,系统就会提示错误并不会让我们插入数据。而此参数为空时,并插入数据长度大于3,则只会插入数据的前三个字符,把后边的字符丢弃,并且系统会提示有一个警告。

STRICT_ALL_TABLES变量使用举例:
MariaDB [test]> CREATE TABLE t1 (ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,Name CHAR(3));
Query OK, 0 rows affected (0.06 sec)
MariaDB [test]> INSERT INTO t1 (Name)VALUES('bols');
ERROR 1406 (22001): Data too long for column 'Name' at row 1
MariaDB [test]> INSERT INTO t1 (Name)VALUES('bo');
Query OK, 1 row affected (0.00 sec)
MariaDB [test]> SELECT * FROM t1;
+----+------+
| ID | Name |
+----+------+
|  1 | bo   |
+----+------+
1 row in set (0.00 sec)
MariaDB [test]> SET SESSION sql_mode='';
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> SELECT @@SESSION.sql_mode;
+--------------------+
| @@SESSION.sql_mode |
+--------------------+
|                    |
+--------------------+
1 row in set (0.00 sec)
MariaDB [test]> INSERT INTO t1(Name) VALUES('longls');
Query OK, 1 row affected, 1 warning (0.07 sec)
MariaDB [test]> SHOW WARNINGS;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'Name' at row 1 |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)
MariaDB [test]> SELECT * FROM  t1;
+----+------+
| ID | Name |
+----+------+
|  1 | bo   |
|  2 | lon  |
+----+------+
2 rows in set (0.00 sec)


5、mysql中字符大小写:
SQL关键字及函数名不区分字符大小写;

数据库、表及视图名称的大小区分与否取决于低层OS及FS;

存储过程、存储函数及事件调度器的名字不区分大小写,但触发器区分;

表别名区分大小写;

对字段中的数据,如果字段类型为Binary类型,则区分大小写;非Binary不区分大小写;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息