zoukankan      html  css  js  c++  java
  • 数据库

    一、数据库的配置

    ​ 通过统一设置配置文件,实现服务端(mysql)、客户端(client)的统一管理。

    ​ 配置统一编码流(utf8)程:

    1. 在mysql安装目录下,创建配置文件my.ini;
    2. 配置文件内容并保存
    [mysqld]  # 服务器配置
    port=3306  # 可以修改数据库默认端口(如果数据库端口被其他软件占用)
    character-set-server=utf8  # 编码格式
    collation-server=utf8_general_ci  # 排序方式(默认跟编码格式走)
    
    [client]  # mysql自己的客户端叫[mysql],配置[client]即配置了[mysql],也配置了其他存在方式的客户端,比如Navicat可视化客户端
    default-character-set=utf8  # 编码格式
    
    1. 重启数据库服务

    二、数据库修改信息

    ​ 修改字符编码:

    mysql>:alter database 数据库名 charset=编码格式;
    

    三、用户操作(重点)

    ​ 为特定的数据库分配操作权限给特定用户:

    mysql>:grant 权限1,权限2... on 数据库.表 to 用户名@'主机名' identified by '密码';
    
    1. all(权限):所有权限;
    2. select,delete,update,insert,drop,alter:指定权限;
    3. 数据库.*:数据库下所有表;
    4. 用户名@'%':任何机器可以通过‘用户名’登录;

    ​ 撤销权限:

    mysql>:revoke 权限1,权限2... on 数据库.表 from 用户名@'主机名';
    

    ​ 删除用户:

    mysql>:drop user 用户名@'主机名';
    

    四、表的修改

    ​ 修改表名:

    mysql>: alter table 旧表 rename 新表;
    

    ​ 修改字段:

    mysql>: alter table 表名 change 旧字段 新字段 类型(长度);
    

    ​ 修改字段属性:

    mysql>: alter table 表名 modify 字段 新类型(长度);
    

    五、创建表的完整语法

    mysql>: create table 表名(
    		属性名1 类型(长度) 约束,
        	...
        	属性名2 类型(长度) 约束,
    )engine=引擎 default charset=utf8;
    

    ​ 长度和约束在某些情况下可以省略。

    六、数据库表的引擎:数据库优化-驱动数据的方式

    ​ 引擎是建表是规定, 提供给表使用的, 不是数据库。

    ​ 展示所有引擎:

    mysql>:show engines; 
    

    ​ innodb(默认): 支持事务, 行级锁, 外键:

    mysql>: create table t11(id int)engine=innodb;
    

    ​ myisam:查询效率要优于innodb, 当不需要支持事务, 行级锁, 外键, 可以通过设置myisam来优化数据库:

    mysql>: create table t12(id int)engine=myisam;
    

    ​ blackhole黑洞,存进去的数据都会消失(可以理解不存数据):

    create table t13(id int)engine=blackhole;
    

    ​ memory表结构是存储在硬盘上的,但是表数据全部存储在内存中:

    mysql>: create table t14(id int)engine=memory;
    

    七、数据库的模式

    ​ mysql 5.7 以后默认都是安全模式,之前都有安全模式和非安全模式。

    sql_model=no_engine_substitution  # 非安全性,默认
    sql_model=strict_trans_tables  # 安全性
    

    ​ 查看当前数据库模式:

    show variables like "%sql_mode%"; # %匹配0~n个任意字符 => 模糊查询
    

    ​ 在设置后,quit断开数据库连接后(服务器不重启)就会进入安全模式,安全模式下,非安全模式下sql执行的警告语句,都会抛异常。

    八、mysql支持的数据类型

    8.1 整型

    ​ tinyint:1字节,取值范围-128~127,默认长度4;

    ​ smallint:2字节,取值范围 -32768 ~ 32767,默认长度6;

    ​ mediumint:3字节;

    ​ int:4字节 -2147483648~2147483647;

    ​ bigint:8字节;

    ​ 约束:

    ​ unsigned:无符号;

    ​ zerofill:0填充;

    ​ 建表:

    mysql>: create table tb1(x tinyint, y smallint, z int(6));
    

    ​ 插入数据:

    mysql>: insert into tb1 values(128, 32768, 32768);
    

    ​ 结论:整型的长度由所占字节(取值范围)决定,可以自定义长度,但是不影响所占字节(取值范围)

    ​ 所有整型变量的长度一般都省略不写:

    create table tb1(x tinyint, y smallint, z int);
    

    ​ 整型约束:

    mysql>: create table tb2(x tinyint unsigned);  
    mysql>: insert into tb2 values(256), (-1);   
    

    ​ 0填充约束:

    mysql>: create table tb3(x tinyint unsigned zerofill);
    mysql>: insert into tb3 values(10); 
    

    8.2 浮点型

    ​ float(M, D):4字节,3.4E–38~3.4E+38。

    ​ double(M, D):8字节,1.7E–308~1.7E+308。

    ​ decimal(M, D):所在字节M,D大值基础上+2,其实就是M值+2就是decimal字段所占字节数。

    ​ 限制存储宽度:

    ​ (M, D) => M为位数,D为小数位,M要大于等于D

    ​ float(255, 30):精度最低,最常用

    ​ double(255, 30):精度高,占位多

    ​ decimal(65, 30):字符串存,全精度

    ​ 建表:

    ysql>: create table tb4 (age float(256, 30)); # Display width out of range for column 'age' (max = 255)
    mysql>: create table tb5 (age float(255, 31)); # Too big scale 31 specified for column 'age'. Maximum is 30.
    mysql>: create table tb5 (age float(65, 30)); # 在合理取值范围
        
    mysql>: create table t12 (x float(255, 30));
    mysql>: create table t13 (x double(255, 30));
    mysql>: create table t14 (x decimal(65, 30));
    # 1.111111164093017600000000000000 
    mysql>: insert into t12 values(1.11111111111111111119);  
    # 1.111111111111111200000000000000
    mysql>: insert into t13 values(1.11111111111111111119);
    # 1.111111111111111111190000000000
    mysql>: insert into t14 values(1.11111111111111111119);
    
    # 重点:长度与小数位分析
    # 报错,总长度M必须大于等于小数位D
    mysql>: create table t14 (x decimal(2, 3));
    
    # 能存储 -0.999 ~ 0.999,超长度的小数位会才有四舍五入,0.9994可以存,就是0.999,0.9995不可以存
    mysql>: create table t14 (x decimal(3, 3));  # 整数位 3 - 3,所以最大为0
    
    # 能存储 -9.999 ~ 9.999,超长度的小数位会才有四舍五入,9.9994可以存,就是9.999,9.9995不可以存
    mysql>: create table t14 (x decimal(4, 3));  # 整数位 4 - 3,所以最大为9
    
    # 能存储 -99.999 ~ 99.999,超长度的小数位会才有四舍五入,99.9994可以存,就是99.999,99.9995不可以存
    mysql>: create table t14 (x decimal(5, 3));  # 整数位 5 - 3,所以最大为99
    

    8.3 字符串

    ​ 数据库优化 - char效率要高于varchar。

    ​ char:定长,永远采用设置的长度存储数据

    ​ varchar:不定长,在设置的长度范围内,变长的存储数据。

    ​ 宽度:

    ​ char(4):存 "a" "ab" "abc" "abcd"都采用4个长度,"abcde" 只能存储前4位(安全模式下报错)。

    ​ varchar(4):存 "a" "ab" "abc" "abcd"分别采用1,2,3,4个长度存储,"abcde" 只能存储前4位(安全模式下报错)。

    ​ char就按定长存储,如果数据长度变化大,通常更占空间,但是存取数据按固定定长操作,效率高。

    ​ varchar存储数据时,会先计算要存储数据的长度,动态变长存储数据,所以一般较省空间,但是计算是需要耗时的,所以效率低。

    ​ varchar计算出的数据长度信息也是需要开辟空间来存储,存储在数据头(数据开始前)中,也需要额外消耗1~2个字节所以如果数据都是固定长度,或是小范围波动,char相比就不会更占空间,且效率高。

    ​ 建表:

    mysql>: create table ts1 (s1 char(4), s2 varchar(4));
    mysql>: insert into ts1 values('adcde', 'xyzabc');  # 'adcd', 'xyza'
    

    九、时间

    ​ 类型:

    ​ year:yyyy(1901/2155)

    ​ date:yyyy-MM-dd(1000-01-01/9999-12-31)

    ​ time:HH:mm:ss

    ​ datetime:yyyy-MM-dd HH:mm:ss(1000-01-0100:00:00/9999-12-31 23:59:59)

    ​ timestamp:yyyy-MM-dd HH:mm:ss(1970-01-0100:00:00/2038-01-19 ??)

    ​ 建表:

    mysql>: create table td1 (my_year year, my_date date, my_time time);
    mysql>: insert into td1 values(1666, '8888-8-8', '8:8:8');  # 时间需要在取值访问内
    
    mysql>: create table td2 (my_datetime datetime, my_timestamp timestamp);   
    mysql>: insert into td2 values('2040-1-1 1:1:1', '2040-1-1 1:1:1');  # 时间需要在取值访问内   
    mysql>: insert into td2(my_datetime) values('2040-1-1 1:1:1');  # timestamp不复制会才有系统当前时间
    
    # datetime:8字节,可以为null
    # timestamp:4字节,有默认值CURRENT_TIMESTAMP
    

    十、枚举与集合

    ​ 枚举与集合:为某一个字段提供选项的 - 枚举只能单选(1个),集合可以多选(0-n个)。

    ​ 建表:

    # enum、set默认值为NULL
    mysql>: create table tc1 (name varchar(20), sex enum('男', '女', '哇塞'), hobbies set('男', '女', '哇塞'));
    mysql>: insert into tc1 values('ruakei', '哇塞哇塞', '未知');  
        
    # enum、set手动设置默认值 '男' 与 '哇塞'
    mysql>: create table tc2 (name varchar(20), sex enum('男', '女', '哇塞') default '男', hobbies set('男', '女', '哇塞') default '哇塞');
    mysql>: insert into tc2 values('ruakei', '哇塞哇塞', '未知');  
    mysql>: insert into tc2(name) values('ruakei');
        
    # 对sex、hobbies两个字段赋值错误,系统默认用空字符串填充(非安全模式),安全模式抛异常
    # 如果对出sex、hobbies两个字段外的其他字段进行赋值,这两个字段会才有默认值
    
    # 注:对set类型的字段进行赋值,用一个字符串,字符串内部用,将多个选项隔开,且不能添加空格等其他额外字符
    mysql>: insert into tc2 values('ruakei_1', '女', '男,女,哇塞');  
    

    十一、约束

    ​ primary key:主键,唯一标识,表都会拥有,不设置为默认找第一个 不空,唯一 字段,未标识则创建隐藏字段。

    ​ foreign key:外键。

    ​ unique:唯一性数据, 该条字段的值需要保证唯一,不能重复。

    ​ auto_increment:自增,只能加给key的int类型字段,作为辅助修饰,一个表中只能设置一个自增字段。

    ​ not null:不为空 - 针对一些字段,如注册时的用户名,出生人的性别等,这些需求下的字段,只不能设置为Null,必须要对其赋值。

    ​ default:默认值 - 对有默认值意外的字段进行赋值时,有默认值的字段会被赋默认值。

    ​ unsigned:无符号 - 存储的数字从0开始。

    ​ zerofill:0填充 - 存整数时数据长度小于取值范围长度,会在数字左方用0填充。

    # not null 与 default 限制
    # 不能为空,没有默认值的x,必须赋值
    # y、z在没有赋值情况下,才有默认值,设置值后,采用默认值
    mysql>: create table td1 (x int not null, y int default 0, z int default 100);
    
    	primary key:主键,唯一标识,表都会拥有,不设置为默认找第一个 不空,唯一 字段,未标识则创建隐藏字段
    

    ​ primary key:主键,唯一标识,表都会拥有,不设置为默认找第一个 不空,唯一 字段,未标识则创建隐藏字段。
    ​ foreign key:外键。
    ​ unique:唯一性数据, 该条字段的值需要保证唯一,不能重复。

    ​ auto_increment:自增,只能加给key的int类型字段,作为辅助修饰,一个表中只能设置一个自增字段。

    ​ not null:不为空 - 针对一些字段,如注册时的用户名,出生人的性别等,这些需求下的字段,只不能设置为Null,必须要对其赋值。

    ​ default:默认值 - 对有默认值意外的字段进行赋值时,有默认值的字段会被赋默认值。

    ​ unsigned:无符号 - 存储的数字从0开始。

    ​ zerofill:0填充 - 存整数时数据长度小于取值范围长度,会在数字左方用0填充。

    # 报错,auto_increment必须设置给 键字段
    mysql>: create table td2 (x int auto_increment);
    # 报错,auto_increment必须设置给 int字段
    mysql>: create table td2 (x char(4) auto_increment);
    # 报错,auto_increment字段最多出现 1次
    mysql>: create table td2 (x int unique auto_increment, y int unique auto_increment);
    
    # 正确,主键和唯一键分析
    # x为主键:没有设置primary key时,第一个 唯一自增键,会自动提升为主键
    mysql>: create table td21 (x int unique auto_increment, y int unique);
    # y为主键:没有设置primary key时,第一个 唯一自增键,会自动提升为主键
    mysql>: create table td22 (x int unique, y int unique auto_increment);
    # x为主键:设置了主键就是设置的,主键没设置自增,那自增是可以设置在唯一键上的
    mysql>: create table td23 (x int primary key, y int unique auto_increment);
    # x为主键:设置了主键就是设置的,主键设置了自增,自增字段只能有一个,所以唯一键不能再设置自增了
    mysql>: create table td24 (x int primary key auto_increment, y int unique);
    # 默认主键:没有设置主键,也没有 唯一自增键,那系统会默认添加一个 隐式主键(不可见)
    mysql>: create table td25 (x int unique, y int unique);
    
    # 唯一键:确保一个字段,数据不能重复
    # 主键:是一条记录的唯一标识(可以理解为数据的编号)
    
    
    
    # 联合唯一
    # ip在port不同时,可以相同,ip不同时port也可以相同,均合法
    # ip和port都相同时,就是重复数据,不合法
    mysql>: create table tu1 (ip char(16), port int, unique(ip, port));
    
    # 也可以设置成 联合主键,道理同 联合唯一
    mysql>: create table tu2 (ip char(16), port int, primary key(ip, port));
    # sql可以多行书写
    mysql>: 
    create table t22(
    	ip char(16),
        port int,
        primary key(ip,port)
    );
    
    
    # 通常自增字段的 自增索引 会被永久记录,想清空表并清空自增索引:
    mysql>: truncate 数据库名.表名
    
  • 相关阅读:
    SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问
    谷歌浏览器扩展程序manifest.json参数详解
    获取天气api
    UVA 10385 Duathlon
    UVA 10668 Expanding Rods
    UVALIVE 3891 The Teacher's Side of Math
    UVA 11149 Power of Matrix
    UVA 10655 Contemplation! Algebra
    UVA 11210 Chinese Mahjong
    UVA 11384 Help is needed for Dexter
  • 原文地址:https://www.cnblogs.com/tangceng/p/11574934.html
Copyright © 2011-2022 走看看