mysql基础2
\s # 查看数据库基本信息(用户、字符编码) ------------------------------------------ mysql Ver 14.14 Distrib 5.6.44, for Win64 (x86_64) Connection id: 6 Current database: Current user: [email protected] SSL: Not in use Using delimiter: ; Server version: 5.6.44 MySQL Community Server (GPL) Protocol version: 10 Connection: localhost via TCP/IP Server characterset: latin1 Db characterset: latin1 Client characterset: gbk Conn. characterset: gbk TCP port: 3306 Uptime: 6 hours 42 min 50 sec Threads: 1 Questions: 12 Slow queries: 0 Opens: 67 Flush tables: 1 Open tables: 60 Queries per second avg: 0.000
my-default.ini # windows下MySQL默认的配置文件
拷贝上述文件并且重命名为my.ini
#字符编码配置 [mysqld] #服务端配置块 character-set-server=utf8 collation-server=utf8_general_ci [client] #客户端配置块 default-character-set=utf8 [mysql] default-character-set=utf8 ---------------------------注意事项-------------------------------- [mysqld] #服务端配置块 修改后,数据库服务需要重新起动
mysql-官网-存储引擎
事务,XA协议,两段提交
查看存储引擎命令
mysql> show engines;
序号 | engine/引擎名称 | support/支持 | Comment/描述 | Transactions/事务 | XA/一种协议 | Savepoints/保存点 |
---|---|---|---|---|---|---|
1/重要 | InnoDB | default/默认使用 | Supports transactions, row-level locking, and foreign keys 支持事务、行级锁定和外键 |
YES/支持 | YES/支持 | YES/支持 |
2/重要 | MyISAM | YES | MyISAM storage engine | no | no | no |
3 | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears)/ | no | no | no |
4 | CSV | YES | CSV storage engine | |||
5 | MEMORY | YES | Hash based, stored in memory, useful for temporary tables/ 基于哈希存储在内存中,对临时表有用 |
no | no | no |
6 | ARCHIVE | YES | Archive storage engine | no | no | no |
7 | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
8 | PERFORMANCE_SCHEM | YES | Performance Schema | no | no | no |
我们可以简单的理解为存储引擎就是针对相同的数据采用的不同的存取策略
InnoDB引擎特点: 1.mysql5.5版本后默认使用 2.存取数据的速度没有MyISAM快,安全性高(支持事务,行级锁和外键) ------------------------------------------------------------- myISAM引擎: 优点:存取数据的速度快 缺点:安全性低,功能少(不支持事务,不支持XA协议,不支持savepoint) ------------------------------------------------------------- memory引擎: 1.不支持事务,不支持XA协议,不支持savepoint, 基于内存的存储引擎,存取速度极快,断电或者重启操作数据会立刻丢失。 ------------------------------------------------------------- balackhole引擎:不支持事务,不支持XA协议,不支持savepoint,写入的数据会丢失,类似于垃圾站
InnoDB .frm 表结构 .ibd 表数据、表索引(加快数据查询) ---------------------------------------------- MyISAM .frm 表结构 .MYD 表数据 .MYI 表索引(加快数据查询) ------------------------------------------------ Memory .frm 表结构 ---------------------------------------------------- BlackHole .frm 表结构
------------创建表并指定引擎--------------------- create table t1(id int) engine=innodb; create table t2(id int) engine=myisam; create table t3(id int) engine=memory; create table t4(id int) engine=blackhole; ---------------插入测试数据----------------------------- insert into t1 values(1); insert into t2 values(1); insert into t3 values(1); insert into t4 values(1); --------------查看插入数据--------------------------------- mysql> select * from t1,t2,t3; +------+------+------+ | id | id | id | +------+------+------+ | 1 | 1 | 1 | +------+------+------+ mysql> select * from t4; Empty set (0.00 sec)
XA协议
分布式事务处理
1.XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准 2.我们常见的数据库连接事务中的 XA 是指由 X/Open 组织提出的分布式事务处理的规范. XA 规范主要定义了事务管理器(Transaction Manager)和局部资源管理器(Local Resource Manager)之间的接口. (资源管理器可以理解为我们常用的数据库 3.使用两阶段提交来完成一个全局事务,XA规范的基础是两阶段提交协议。
Transactions/事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。
savepoint/保存点
保存点(savepoint)是事务过程中的一个逻辑点,用于取消部分事务,当结束事务时,会自动的删除该事务中所定义的所有保存点。当执行rollback时,通过指定保存点可以回退到指定的点。
create table 表名( 字段名1 字段类型(数字) 约束条件, 字段名2 字段类型(数字) 约束条件, 字段名3 字段类型(数字) 约束条件 )engine=存储引擎; --------重要------------------ 1.字段名和字段类型是必须的(至少写一个) 2.数字跟约束条件是可选的(可有可无) 3.约束条件可以写多个 空格隔开即可 4.最后一个字段的结尾千万不能加逗号
整型名称 | 大小 | 范围(无负号) | 范围(有负号) | 用途 |
---|---|---|---|---|
tinyint | 1bytes | (0,255) | -128~127 | 小整数 |
smallint | 2bytes | (0,65 535) | (-32 768,32 767) | 大整数值 |
mediumint | 3Bytes | (0,16 777 215) | (-8 388 608,8 388 607) | 大整数值 |
int | 4bytes | 0,4 294 967 295) | (-2 147 483 648,2 147 483 647) | 大整数值 |
bigint | 8bytes | (0,18 446 744 073 709 551 615) | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | 极大整数值 |
-----------插入-129 256 ------------------------------- create table t6(id tinyint); insert into t6 values(-129),(256); mysql> select * from t6; +------+ | id | +------+ | -128 | | 127 | +------+ 2 rows in set (0.00 sec) -------------总结---------------- 自动填充边界值,数据失真,没有实现实际意义 上述所有的整型类型默认都会带有负号
#例子 create table t8(id tinyint unsigned); #unsigned 约束条件,移除负号。 insert into t8 values(-129),(256); mysql> select * from t8; +------+ | id | +------+ | 0 | | 255 | +------+ 2 rows in set (0.00 sec)
插入的数据超过了数据类型的范围,不应该让其插入并自动修改,没有意义
数据库应该直接报错(这个特性是有的)
方式1:命令临时修改
set session sql_mode='strict_trans_tables' 当前客户端操作界面有效 set global sql_mode='STRICT_TRANS_TABLES' 服务端不重启永久有效
方式二配置文件修改
[mysqld] sql_mode='STRICT_TRANS_TABLES'
浮点型 | 精度 |
---|---|
float | 单精度 |
double | 双精度 |
decimal | 十进制小数型 |
验证精确度问题
--------------例子----------------------------- create table t10(id float(255,30)); create table t11(id double(255,30)); create table t12(id decimal(65,30)); insert into t10 values(1.11111111111111111111111111111); insert into t11 values(1.11111111111111111111111111111); insert into t12 values(1.11111111111111111111111111111); --------验证结果----------- mysql> select * from t10,t11,t12 \G; *************************** 1. row *************************** id: 1.111111164093017600000000000000 id: 1.111111111111111200000000000000 id: 1.111111111111111111111111111110 1 row in set (0.00 sec) --------总结------------ 精确度 float < double < decimal 一般情况下float足够使用,如果追求非常完美的精确度,可以用字符串代替
字符类型 | 优点 | 缺点 | |
---|---|---|---|
char | 定长 | 整存整取 速度快 | 浪费存储空间 |
varchar | 变长 | 节省存储空间 | 存取数据的速度慢于char |
char(4) 最大只能存储四个字符 如果超过范围则直接报错 如果不超出范围 则用空格填充至四个字符 ------------------------------------------- varchar(4) 最大只能存储四个字符 如果超过范围则直接报错 如f果不超出范围 则有几位就存几位 -----------验证两者区别------------------ create table t15(id int, name char(4)); create table t16(id int, name varchar(4)); mysql> insert into t15 value (1,'jason'); ERROR 1406 (22001): Data too long for column 'name' at row 1 mysql> insert into t15 value (1,'jaso'); #char必须插入四个字符 Query OK, 1 row affected (0.00 sec) ------------结果------------------------------ 1.结果验证 超出范围两者都会报错
2.验证定长和变长特性 char_length() # 统计字段数据的长度 """ 默认情况下char在存储的时候针对没有满足固定位数的字符会自动填充空格 然后在读取的时候又会自动将填充的空格移除 如果想取消该机制 需要sql_mode set global sql_mode='strict_trans_tables,pad_char_to_full_length'; 上述目录是替换 不是新增 所以之前的配置也要写上 """ 3.char VS varchar char 整存整取 速度快 浪费存储空间 varchar 节省存储空间 存取数据的速度慢于char """ char(4) a son jacktom lili varchar(4) 1bytes+a1bytes+son1bytes+jack1bytes+tom1bytes+lili 存取数据都需要操作报头(耗时) 存储人的姓名>>>:varchar """ 两者使用频率都很高 现在默认很多时候是varchar
数字大部分情况下都是用来限制字段的存储长度 但是整型除外!!! 不是用来限制存储的长度 而是展示的长度 create table t13(id int(3)); create table t14(id int(3) zerofill); 总结 以后涉及到整型字段的定义 类型后面不需要加括号写数字 除非有业务需求必须固定位数 eg: 00000000013 00123123031
枚举 多选一 eg:性别(男 女 其他) create table t15( id int, name varchar(32), gender enum('male','female','others') ); 集合 多选多(包含多选一) eg:爱好(唱 跳 rap) create table t16( id int, name varchar(32), hobbies set('read','run','music','rap') );
日期类型 | 表示 |
---|---|
date | 年月日 |
datetime | 年月日时分秒 |
time | 时分秒 |
year | 年份 |
create table t17( id int, name varchar(32), birth date, reg_time datetime, study_time time, join_time year ); insert into t17 values(1,'jason','2022-11-11','2000-11-11 11:11:11','11:11:11','1995'); mysql> select * from t17; +------+-------+------------+---------------------+------------+-----------+ | id | name | birth | reg_time | study_time | join_time | +------+-------+------------+---------------------+------------+-----------+ | 1 | jason | 2022-11-11 | 2000-11-11 11:11:11 | 11:11:11 | 1995 | +------+-------+------------+---------------------+------------+-----------+ 1 row in set (0.00 sec)
insert into 表名 vlaues() # 默认按照创建表的字段顺序添加 insert into 表名(字段) vlaues() # 可以自定义字段顺序 ===================================================================================== 1.unsigned 无负号 id int unsigned 2.zerofill 零填充 id int zerofill 3.not null 非空 name varchar(32) not null 4.default 默认值 name varchar(32) default 'jason' 5.unique 唯一值 id int unique 单列唯一 host varchar(32) port int unique(host,port) 联合唯一