时间:2021-07-01 10:21:17 帮助过:13人阅读
目录
大家发现每次进入mysql都需要进行登录操作,而且服务器的编码为Latin1,客户端的编码为GBK,这样就很容易造成乱码,所以我们就需要进行一个统一
在根目录(程序安装的路径)下创建一个配置文件,名称为my.ini
内容为cfg格式,即section+option
[mysqld] 分区为服务器端配置,修改后需要重启服务器
[mysql] 分区为客户端配置,修改后需要进行重连
统一编码方式配置文件:
# 客户端配置
[client]
user = root
password = 你的密码
default-character-set = utf8
# 服务器端配置 需要重启服务器
[mysqld]
character-set-server = utf8
数据库引擎是数据库最核心的部分,地位相当于人类的心脏,它是负责存储数据的模块
可以通过 show engines;
查看引擎
可以看到,mysql里面有好几个引擎,但到底那个好呢?
这个是没有定论的,每个引擎有不同的作用,我们要根据实际需求来选择合适的引擎
Mysql数据库默认引擎为InnoDB
创建表指定引擎
create table 名称(字段 类型 ) engine = XXXX;
# 插入数据
insert into 表名 values(数据1,数据2,……); # 该方式必须保证插入的数据个数和表格字段数量一样
# 选择部分字段插入
insert into 表名(字段名称1,字段名称2) values(数据1,数据2); # 该方式必须保证插入的数据个数与指定的字段数量一样
# 同时插入多个记录
insert into 表名(字段名称1,字段名称2) values(数据1,数据2),(数据1,数据2);
# 查询所有记录
select * from 表名;
# 查询符合条件的字段
select 字段 from 表名 where 条件;
# 更新所有的记录
uptade 表名 set 字段1=新的值1,字段2=新的值2;
# 更新符合条件的记录
update 表名 set 字段1=新的值1,字段2=新的值2 where 条件;
# 删除所有记录
delete from 表名;
# 删除满足条件的记录
delete from 表名 where 条件;
create table 表名(字段名称1 字段类型[(长度) 约束],字段名称1 字段类型[(长度) 约束]……) charset utf8;
默认情况下为有符号的,需要设置为无符号要在增加unsigned约束
alter table 表名 modify 字段 数据类型 unsigned;
create table 表名(字段 数据类型 unsigned)
mysql 5.6 版本在默认情况下,为非加严模式,如果数据类型超过范围,就会自动取最大值,这样就不能保证数据的安全,所以可以在配置中设置为加严模式,或者临时设置sql_mode,但退出后又会恢复非加严模式
# 查看当前的sql模式
select @@sql_model # @ 表示全局变量 @@ 表示局部变量
+---------------------+
| @@sql_mode |
+---------------------+
| STRICT_TRANS_TABLES | # 当前为非加严模式
+---------------------+
# 1.临时设置
set @@sql_mode = " STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
select @@sql_model
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | # 加严模式
+--------------------------------------------+
# 2.修改配置,永久有效
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
指定长度
比如int(5),表示数据最小长度为5,如果数据不足5位,默认用空填充,如果要用0填充,需要增加zerofill约束
create table test(x int(5) zerofill);
insert into test values(2);
insert into test values(201780); # 证明5并不是限制最大长度的
select *from test;
+--------+
| x |
+--------+
| 00002 |
| 201780 |
+--------+
数据类型(M,D) 表示整数位最大长度为M-D,超出则会报错,小数位最大长度为D,如果小数位超过了,则会自动进行四舍五入
create table test(x float(5,3));
insert into test values(2.56789);
Query OK, 1 row affected (0.21 sec)
select *from test;
+-------+
| x |
+-------+
| 2.568 |
+-------+
insert into test values(100); # 报错,最大只能为99.999
ERROR 1264 (22003): Out of range value for column 'x' at row 1
float类型 不需要指定位数,最大只能精确到小数点后5位
double类型 不需要指定位数,最大只能精确到小数点后15位
decimal类型 必须指定位数,长度最大为65,小数点后面最长为30
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
定义时需要指定字符串长度,默认为1,比如char(10),表示最大只能有10个字符,超出长度自动取前10个字符,而少于10个字符的自动在前面补足空格
定义时也需要指定字符串长度,但是和char的区别就是varchar不会自动补空格,而且varcher最终占?的空间为实际内容所占字节数+1,因为需要一个bit 存储字符长度
值 | char(4) | 存储需求 | varcher(4) | 存储需求 |
---|---|---|---|---|
‘’ | ‘ ‘ | 4个字节 | ‘‘ | 1个字节 |
‘ab‘ | ‘ab ‘ | 4个字节 | ‘ab‘ | 3个字节 |
‘abcd‘ | ‘abcd | 4个字节 | ‘abcd‘ | 5个字节 |
‘abcdefg‘ | ‘abcd‘ | 4个字节 | ‘abcd‘ | 5个字节 |
存放长度较大的字符串
存放的是二进制
类型 | 大小 |
---|---|
ENUM | 对1-255个成员的枚举需要1个字节存储; 对于255-65535个成员,需要2个字节存储; 最多允许65535个成员。 |
SET | 1-8个成员的集合,占1个字节 9-16个成员的集合,占2个字节 17-24个成员的集合,占3个字节 25-32个成员的集合,占4个字节 33-64个成员的集合,占8个字节 |
枚举是提前规定一个范围 你的值只能是其中之一 多选一
集合是提前规定一个范围 你的值可以是其中的多个 多选多
集合在插入数据时 ,多个值之前用逗号隔开 但他们必须包含在同一个字符串内!
create table t10 (name char(20),gender enum('female','male'));
Query OK, 0 rows affected (0.01 sec)
# 选择enum('female','male')中的一项作为gender的值,可以正常插入
insert into t10 values ('nick','male');
Query OK, 1 row affected (0.00 sec)
# 不能同时插入'male,female'两个值,也不能插入不属于'male,female'的值
insert into t10 values ('nick','male,female');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
create table t11 (name char(20),hobby set('抽烟','喝酒','烫头','翻车'));
Query OK, 0 rows affected (0.01 sec)
# 可以任意选择set('抽烟','喝酒','烫头','翻车')中的项,并自带去重功能
insert into t11 values ('tank','烫头,喝酒,烫头');
Query OK, 1 row affected (0.01 sec)
select * from t11;
+------+---------------+
| name | hobby |
+------+---------------+
| tank | 喝酒,烫头 |
+------+---------------+
row in set (0.00 sec)
# 不能选择不属于set('抽烟','喝酒','烫头','翻车')中的项,
insert into t11 values ('jason','烫头,翻车,看妹子');
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 年月日 |
TIME | 3 | ‘-838:59:59‘/‘838:59:59‘ | HH:MM:SS | 时分秒 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 0000-00-00 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD\HH:MM:SS | 年月日时分秒 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD\HHMMSS | 混合日期和时间值,时间戳 |
date/time/datatime类型
create table t4 (d date,t time,dt datetime);
Query OK, 0 rows affected (0.02 sec)
desc t4;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d | date | YES | | NULL | |
| t | time | YES | | NULL | |
| dt | datetime | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
rows in set (0.01 sec)
insert into t4 values (now(),now(),now());
Query OK, 1 row affected, 1 warning (0.01 sec)
select * from t4;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
+------------+----------+---------------------+
row in set (0.00 sec)
insert into t4 values (null,null,null);
Query OK, 1 row affected (0.01 sec)
select * from t4;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
| NULL | NULL | NULL |
+------------+----------+---------------------+
rows in set (0.00 sec)
timestamp类型
create table t5 (id1 timestamp);
Query OK, 0 rows affected (0.02 sec)
desc t5;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
row in set (0.00 sec)
# 插入数据null,会自动插入当前时间的时间
insert into t5 values (null);
Query OK, 1 row affected (0.00 sec)
select * from t5;
+---------------------+
| id1 |
+---------------------+
| 2018-09-21 14:56:50 |
+---------------------+
row in set (0.00 sec)
#添加一列 默认值是'0000-00-00 00:00:00'
alter table t5 add id2 timestamp;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
show create table t5 \G;
*************************** 1. row ***************************
Table: t5
Create Table: CREATE TABLE `t5` (
`id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
row in set (0.00 sec)
ERROR:
No query specified
# 手动修改新的列默认值为当前时间
alter table t5 modify id2 timestamp default current_timestamp;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
show create table t5 \G;
*************************** 1. row ***************************
Table: t5
Create Table: CREATE TABLE `t5` (
`id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`id2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8
row in set (0.00 sec)
ERROR:
No query specified
insert into t5 values (null,null);
Query OK, 1 row affected (0.01 sec)
select * from t5;
+---------------------+---------------------+
| id1 | id2 |
+---------------------+---------------------+
| 2018-09-21 14:56:50 | 0000-00-00 00:00:00 |
| 2018-09-21 14:59:31 | 2018-09-21 14:59:31 |
+---------------------+---------------------+
rows in set (0.00 sec)
year类型
create table t7 (y year);
Query OK, 0 rows affected (0.02 sec)
insert into t7 values (2018);
Query OK, 1 row affected (0.00 sec)
select * from t7;
+------+
| y |
+------+
| 2018 |
+------+
row in set (0.00 sec)
注意:上述时间,两位数0-69 翻译为 2000-2069 70-99 翻译为1790-1999
MySQL基础-2
标签:body tiny 变量 配置 表名 形式 charset bit esc