MySQL(四)之MySQL数据类型
一、数据字典数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明。 数据字典(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 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 ;
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后都会失效;想永久有效,可定义在配置文件中的相应段中;
应用举例:
MariaDB > SET SESSION sql_mode='STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)
MariaDB > 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 > 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 > CREATE TABLE t1 (ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,Name CHAR(3));
Query OK, 0 rows affected (0.06 sec)
MariaDB > INSERT INTO t1 (Name)VALUES('bols');
ERROR 1406 (22001): Data too long for column 'Name' at row 1
MariaDB > INSERT INTO t1 (Name)VALUES('bo');
Query OK, 1 row affected (0.00 sec)
MariaDB > SELECT * FROM t1;
+----+------+
| ID | Name |
+----+------+
|1 | bo |
+----+------+
1 row in set (0.00 sec)
MariaDB > SET SESSION sql_mode='';
Query OK, 0 rows affected (0.00 sec)
MariaDB > SELECT @@SESSION.sql_mode;
+--------------------+
| @@SESSION.sql_mode |
+--------------------+
| |
+--------------------+
1 row in set (0.00 sec)
MariaDB > INSERT INTO t1(Name) VALUES('longls');
Query OK, 1 row affected, 1 warning (0.07 sec)
MariaDB > SHOW WARNINGS;
+---------+------+-------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'Name' at row 1 |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)
MariaDB > SELECT * FROMt1;
+----+------+
| ID | Name |
+----+------+
|1 | bo |
|2 | lon|
+----+------+
2 rows in set (0.00 sec)
5、mysql中字符大小写:
[*] SQL关键字及函数名不区分字符大小写;
[*] 数据库、表及视图名称的大小区分与否取决于低层OS及FS;
[*] 存储过程、存储函数及事件调度器的名字不区分大小写,但触发器区分;
[*] 表别名区分大小写;
[*] 对字段中的数据,如果字段类型为Binary类型,则区分大小写;非Binary不区分大小写;
页:
[1]