简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 软件之一。在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。
MySQL权限表
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别为user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
- user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
- db权限表:记录各个帐号在各个数据库上的操作权限,里面的权限是数据库级的。
- table_priv权限表:记录数据表级的操作权限。
- columns_priv权限表:记录数据列级的操作权限。
- host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。
MySQL中的权限管理:
- 授予权限:
- 撤销权限:
MySQL日志
MySQL的常见日志log分为以下类型:
日志类型 | 日志内容 |
错误日志 | mysql 启动、停止和运行过程中出现的异常 |
常规操作日志 | 已创建客户端连接和客户端处理记录 |
二进制日志 | 数据变更日志可用于同步 |
转存日志 | 从主服务器同步的数据记录 |
慢查询日志 | 耗时超过 long_query_time 所设置时间的查询 |
DDL日志(元日志) | ddl 语句执行的元数据操作 |
其中,二进制日志binlog是实际最常使用的日志,因为它可以对数据库进行恢复。
binlog的录入格式为:
- Statement(只记录修改语句):只记录每条修改数据的SQL执行语句;但还必须记录每条语句在执行的时候的一些相关信息,确保所有语句能在slave得到和在master端(主从复制)执行时候相同的结果。但一些函数功能不能被复制。
- row(只记录修改结果):不记录SQL的上下语句信息,只记录那一条记录被修改成什么了;解决了Statement的问题,但单语句更新(删除)表的行数过多,会导致形成大量binlog。
- Mixedlevel(混合):前两个的混合使用,一般的语句修改用Statement,一些函数复制等用row,根据执行的语句来选择使用哪种方式。
MySQL数据类型
MySQL中定义数据字段的类型对数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串字符类型。
数值类型
类型 | 大小 | 用途 |
TINYINT | 1 byte | 小整数值 |
SMALLINT | 2 bytes | 大整数值 |
MEDIUMINT | 3 bytes | 大整数值 |
INT或INTEGER | 4 bytes | 大整数值 |
BIGINT | 8 bytes | 极大整数值 |
FLOAT | 4 bytes | 单精度 浮点数值 |
DOUBLE | 8 bytes | 双精度 浮点数值 |
DECIMAL | 对DECIMAL,M,D ,如果M>D,为M+2否则为D+2 | 小数值 |
MySQL中
DECIMAL
数据类型用于在数据库中存储精确的数值。例如语法:column_name DECIMAL(P,D)
其中P表示的是有效数字的位数,D表示是小数的位数,D小于或等于P。
理解可看下面代码:
create table decimal_test(
id int auto_increment PRIMARY key,
score decimal(5,2) -- 取值范围是 -999.99 到 999.99
);
日期和时间类型
每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。
类型 | 大小 bytes | 格式 | 用途 |
DATE | 3 | YYYY-MM-DD | 日期值 |
TIME | 3 | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | YYYY | 年份值 |
DATETIME | 8 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符类型
类型 | 大小 | 用途 |
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
- char(n)和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数。
- CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
- 定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的
- char的存取速度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。