mysql数据类型和权限

数据类型

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
字符串类型

注意事项

  1. char(n) 和 varchar(n) 中括号中n代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储30 个字符
  2. CHAR和VARCHAR类型类似,但它们保存和检索的方式不同,它们的最大长度和是否尾部空格被保留等方面也不同,在存储或检索过程中不进行大小写转换
  3. BINARY和VARBINARY类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值
  4. BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,区别在于可容纳存储范围不同
  5. 有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,对应的这4种BLOB类型,可存储的最大长度不同

权限

原则

数据库的权限按最小权限为原则
mysql中存在4个控制权限的表,分别为user表、db表、tables_priv表、columns_priv表
mysql权限表的验证过程为:

  1. 先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证
  2. 通过身份认证后,进行权限分配,按照user、db、tables_priv、columns_priv的顺序进行验证:
    1. 先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db、tables_priv、columns_priv
    2. 如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限
    3. 如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推

所有权限

所有权限

数据库层面(db表)的权限

数据库层面的权限

mysql安全配置方案

  1. 限制访问mysql端口的ip:windows可以通过windows防火墙或者ipsec来限制,linux下可以通过firewalld来限制
  2. 修改mysql的端口:windows下可以修改配置文件my.ini来实现,linux可以修改配置文件my.cnf来实现
  3. 对所有用户设置强密码并严格指定对应账号的访问ip:mysql中可在user表中指定用户的访问可访问ip
  4. root特权账号的处理:建议给root账号设置强密码,并指定只容许本地登录
  5. 日志的处理:如需要可开启查询日志,查询日志会记录登录和查询语句
  6. mysql进程运行账号
    1. 在windows下禁止使用local system来运行mysql账户,可以考虑使用network service或者自己新建一个账号,但是必须给与mysql程序所在目录的读取权限和data目录的读取和写入权限;
    2. 在linux下,新建一个mysql账号,并在安装的时候就指定mysql以mysql账户来运行,给与程序所在目录的读取权限,data所在目录的读取和写入权限
  7. mysql运行账号的磁盘权限
    1. mysql运行账号需要给予程序所在目录的读取权限,以及data目录的读取和写入权限
    2. 不容许给予其他目录的写入和执行权限,特别是有网站的
    3. 取消mysql运行账户对于cmd,sh等一些程序的执行权限
  8. 网站使用的mysql账户的处理: 新建一个账户,给予账户在所使用数据库的所有权限即可。这样既能保证网站对所对应的数据库的全部操作,也能保证账户不会因为权限过高而影响安全
  9. 删除无用数据库: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"