数据类型
mysql支持多种类型,大致可以分为3类:数值类型、日期和时间类型、字符串类型
数值类型
mysql支持所有标准SQL数值数据类型,包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)关键字int是integer的同义词,关键字dec是decmial的同义词
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT
日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR,每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET
注意事项
- char(n) 和 varchar(n) 中括号中n代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储30 个字符
- CHAR和VARCHAR类型类似,但它们保存和检索的方式不同,它们的最大长度和是否尾部空格被保留等方面也不同,在存储或检索过程中不进行大小写转换
- BINARY和VARBINARY类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值
- BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,区别在于可容纳存储范围不同
- 有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,对应的这4种BLOB类型,可存储的最大长度不同
权限
原则
数据库的权限按最小权限为原则
mysql中存在4个控制权限的表,分别为user表、db表、tables_priv表、columns_priv表
mysql权限表的验证过程为:
- 先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证
- 通过身份认证后,进行权限分配,按照user、db、tables_priv、columns_priv的顺序进行验证:
- 先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db、tables_priv、columns_priv
- 如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限
- 如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推
所有权限
数据库层面(db表)的权限
mysql安全配置方案
- 限制访问mysql端口的ip:windows可以通过windows防火墙或者ipsec来限制,linux下可以通过firewalld来限制
- 修改mysql的端口:windows下可以修改配置文件my.ini来实现,linux可以修改配置文件my.cnf来实现
- 对所有用户设置强密码并严格指定对应账号的访问ip:mysql中可在user表中指定用户的访问可访问ip
- root特权账号的处理:建议给root账号设置强密码,并指定只容许本地登录
- 日志的处理:如需要可开启查询日志,查询日志会记录登录和查询语句
- mysql进程运行账号:
- 在windows下禁止使用local system来运行mysql账户,可以考虑使用network service或者自己新建一个账号,但是必须给与mysql程序所在目录的读取权限和data目录的读取和写入权限;
- 在linux下,新建一个mysql账号,并在安装的时候就指定mysql以mysql账户来运行,给与程序所在目录的读取权限,data所在目录的读取和写入权限
- mysql运行账号的磁盘权限:
- mysql运行账号需要给予程序所在目录的读取权限,以及data目录的读取和写入权限
- 不容许给予其他目录的写入和执行权限,特别是有网站的
- 取消mysql运行账户对于cmd,sh等一些程序的执行权限
- 网站使用的mysql账户的处理: 新建一个账户,给予账户在所使用数据库的所有权限即可。这样既能保证网站对所对应的数据库的全部操作,也能保证账户不会因为权限过高而影响安全
- 删除无用数据库:test数据库对新建的账户默认有权限
安全配置需要的常用命令
# 1. 新建一个用户并给予相应数据库的权限
# 所有权限
grant all privileges on database.* to user@localhost identified by 'passwd';
# 常用权限
grant select,insert,update,delete,create,drop privileges on database.* to user@localhost identified by 'passwd';
# 写入权限(防止删除,仅能更新和插入)
grant select,insert,update privileges on database.* to user@localhost identified by 'passwd';
# 2. 刷新权限
flush privileges;
# 3. 显示授权
show grants;
# 4. 移除授权
revoke delete on *.* from 'jack'@'localhost';
# 5. 删除用户
drop user 'jack'@'localhost';
# 6. 给用户改名
rename user 'jack'@'%' to 'jim'@'%';
# 7. 给用户改密码
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');
# 8. 删除数据库
drop database test;
# 9. 从数据库导出文件
select * from a into outfile "~/abc.sql"