本文首发于 慕雪的寒舍
mysql的基础命令
本文所用mariadb版本
mysql Ver 15.1 Distrib 10.3.28-MariaDB, for Linux (x86_64) using readline 5.1
create, drop, alter
insert,delete,update
select
grant,revoke,commit
默认情况下,我们的mysql没有密码,直接使用如下命令,就能链接上mysql
mysql -uroot;
mysql数据库文件路径
/var/lib/mysql
mysql的语句是大小写不敏感的,大小写都可以。
show processlist;
该命令可以查看当前有谁连接了,所在数据库是什么,正在执行的cmd是什么
mysql支持多种存储引擎
存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
每个引擎各有其优势。可以用下面的语句查询当前支持的引擎
show engines;
create database 数据库名字;
create database if not exists 数据库名字; # 如果不存在才创建
create database hello;
上面的命令创建了一个名为hello
的数据库。对于mysql服务端而言,其实际上是在数据文件路径中,帮我们创建了一个对应的文件夹
如果是mysql5.7
,在创建语句之前新增一个show
,可以看到当前执行语句的详细信息。我当前使用的是高版本的mariadb,不支持这个操作
show create database hello;
创建数据库或者表的时候,我们还可以给名称带上如下符号作为分割符
create database `数据库名称`;
MariaDB [(none)]> create database `test2`;
Query OK, 1 row affected (0.001 sec)
带上该符号后,可以用于区分你的表名和数据库的内置语句。建议创建、删除操作的时候,都给名字带上这个符号。
当然,创建的数据库、表名最好不要和mysql
内置语句冲突,这和写代码的时候不要用编程语言的关键字/库函数名来命名变量一样。
show databases;
查看当前已有数据库
+--------------------+
| Database |
+--------------------+
| hello |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)
进入这个数据库
use hello;
drop database [if exists] 名字;
如下,我先是创建了一个test1
数据库
MariaDB [(none)]> create database test1;
Query OK, 1 row affected (0.001 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| hello |
| information_schema |
| mysql |
| performance_schema |
| test1 |
+--------------------+
5 rows in set (0.000 sec)
用下面这个命令删除该数据库
drop database test1;
成功删除
MariaDB [(none)]> drop database test1;
Query OK, 0 rows affected (0.035 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| hello |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)
数据文件路径中,test1文件夹也被对应删除
字符集会有自己对应的校验规则
修改字符集的时候,mysql会为我们自动指定对应的校验规则
一个数据被存放的时候,是会有其所用的编码的。编码不相同,会导致数据在不同软件中显示出不同的结果。
比如 我们使用VS写的C语言代码,文件内的中文注释放入
devc++
之中,有可能会乱码,这就是字符编码不匹配的原因
show variables like
语句可以查看mysql的内置变量,其中如下变量就是数据库字符集的编码格式
show variables like 'character_set_database';
可以看到,为utf-8
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
1 row in set (0.002 sec)
在配置mariadb的时候,就已经修改过了数据库的编码规则,所以所有相关字符集编码都是utf-8
show variables like 'character_set_%';
MariaDB [(none)]> show variables like 'character_set_%';
+--------------------------+------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mariadb/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0.002 sec)
使用如下命令可以查看数据库支持的所有编码
show charset;
MariaDB [(none)]> show charset;
+----------+-----------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| binary | Binary pseudo charset | binary | 1 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
+----------+-----------------------------+---------------------+--------+
40 rows in set (0.001 sec)
show variables like 'collation_%';
如下可以看到,当前的校验规则都是utf-8
相关的
MariaDB [(none)]> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.001 sec)
查看系统中所有校验集
show collation;
结果很长,就不全贴出来了。能看到每一个编码集都对应了一个字符集
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
其中[]
代表是可选项
如果在创建数据库时没有指定字符集和校验规则,则会采用数据库默认的。
在数据库的文件夹中,有一个db.opt
文件,其中就包含了当前数据库使用的字符集和校验规则
[root@1c2261732150:/var/lib/mysql]# ls hello
db.opt stu_test.frm stu_test.ibd
[root@1c2261732150:/var/lib/mysql]# cat hello/db.opt
default-character-set=utf8
default-collation=utf8_general_ci
如果在创建的时候指明字符集编码
create database `test1` character set gbk;
create database `test1` charset=gbk; # 两种写法相同
查看db.opt
,可以看到系统自动指定了gbk字符集对应的校验和
[root@1c2261732150:/var/lib/mysql]# ls test1
db.opt
[root@1c2261732150:/var/lib/mysql]# cat test1/db.opt
default-character-set=gbk
default-collation=gbk_chinese_ci
同时指定字符集和编码
create database `test2` charset=utf8 collate utf8_bin;
执行成功后,查看本地文件
[root@1c2261732150:/var/lib/mysql]# cat test2/db.opt
default-character-set=utf8
default-collation=utf8_bin
成功设置了字符集和编码规则
虽然在创建的时候可以这么做,但我们保持默认配置的utf8即可
通过指定不同的编码,我创建了两个校验规则不同的数据库
MariaDB [(none)]> create database test_ci charset=utf8;
Query OK, 1 row affected (0.001 sec)
MariaDB [(none)]> create database test_bin charset=utf8 collate utf8_bin;
Query OK, 1 row affected (0.000 sec)
其中一个的校验规则是utf8_general_ci
,另外一个是utf8_bin
[root@1c2261732150:/var/lib/mysql]# cat test_bin/db.opt
default-character-set=utf8
default-collation=utf8_bin
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=utf8
default-collation=utf8_general_ci
先进入test_bin
数据库
use test_bin;
创建一个student表,只有一个字符串类型的name字段
create table student(name varchar(30));
插入如下数据
MariaDB [test_bin]> insert into student value ('a');
Query OK, 1 row affected (0.042 sec)
MariaDB [test_bin]> insert into student value ('A');
Query OK, 1 row affected (0.008 sec)
MariaDB [test_bin]> insert into student value ('b');
Query OK, 1 row affected (0.003 sec)
MariaDB [test_bin]> insert into student value ('B');
Query OK, 1 row affected (0.004 sec)
MariaDB [test_bin]> insert into student value ('c');
Query OK, 1 row affected (0.009 sec)
MariaDB [test_bin]> insert into student value ('C');
Query OK, 1 row affected (0.007 sec)
查看已有数据,分别是大小写的abc
MariaDB [test_bin]> select * from student;
+------+
| name |
+------+
| a |
| A |
| b |
| B |
| c |
| C |
+------+
6 rows in set (0.001 sec)
查询数据,可以看到,返回的结果是只有小写a的
MariaDB [test_bin]> select * from student where name='a';
+------+
| name |
+------+
| a |
+------+
1 row in set (0.001 sec)
执行排序(升序)后输出,得到如下结果。我们知道,小写字母的ASCII是在大写字母的之后的,所以这个排序结果是正确的。
MariaDB [test_bin]> select * from student order by name;
+------+
| name |
+------+
| A |
| B |
| C |
| a |
| b |
| c |
+------+
6 rows in set (0.001 sec)
use test_ci;
在这个数据库中进行相同的插入工作,创建表,插入大小写abc(命令同上不再重复)
MariaDB [test_ci]> select * from student;
+------+
| name |
+------+
| a |
| A |
| b |
| B |
| c |
| C |
+------+
6 rows in set (0.000 sec)
执行查询语句,发现当我们查询小a的时候,同时返回了A和a的结果
MariaDB [test_ci]> select * from student where name='a';
+------+
| name |
+------+
| a |
| A |
+------+
2 rows in set (0.001 sec)
排序的时候,大小a没有按ASCII码顺序排,而是放到了一起
MariaDB [test_ci]> select * from student order by name;
+------+
| name |
+------+
| a |
| A |
| b |
| B |
| c |
| C |
+------+
6 rows in set (0.001 sec)
在实际场景中,我们就可以根据需求,选择这两个校验规则中的其一作为我们数据库的校验规则。
这两个只是众多校验规则之一,更多编码的区别,还得等后续慢慢探寻。在一般场景中,使用utf8是完全足够的。
alter database 数据库名 [create_specification [,
create_specification] ...];
一般情况下,我们修改的是数据库的字符集和校验规则。
示例如下,修改数据库test_ci
的字符集为gbk
MariaDB [test_ci]> alter database test_ci charset=gbk;
Query OK, 1 row affected (0.006 sec)
修改后查看配置文件,字符集和校验规则确实变化了(系统自动查找对应的校验规则)
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=utf8
default-collation=utf8_general_ci
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=gbk
default-collation=gbk_chinese_ci
也可以同时修改校验规则,这里和新建数据库时的操作是一样的
alter database test_ci charset=utf8 collate utf8_bin;
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=gbk
default-collation=gbk_chinese_ci
[root@1c2261732150:/var/lib/mysql]# cat test_ci/db.opt
default-character-set=utf8
default-collation=utf8_bin
如下操作是在linux命令行中执行的
mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
示例
mysqldump -P3306 -u root -B hello > hello.bak.sql
这会在当前路径中出现了一个sql
文件,其内容如下。
-- MySQL dump 10.19 Distrib 10.3.28-MariaDB, for Linux (x86_64)
--
-- Host: localhost Database: hello
-- ------------------------------------------------------
-- Server version 10.3.28-MariaDB
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Current Database: `hello`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hello` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `hello`;
--
-- Table structure for table `stu_test`
--
DROP TABLE IF EXISTS `stu_test`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `stu_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`score` decimal(4,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `stu_test`
--
LOCK TABLES `stu_test` WRITE;
/*!40000 ALTER TABLE `stu_test` DISABLE KEYS */;
INSERT INTO `stu_test` VALUES (2,'小图图',5,72.80),(3,'大司马',42,87.30),(4,'乐迪',32,99.00);
/*!40000 ALTER TABLE `stu_test` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2023-04-15 15:20:25
我们会发现这里面的内容其实都是sql语句,如果将这个备份导入到另外一个数据库中,实际上就是将历史的所有sql语句全部执行一遍!
除此之外,复制
/var/lib/mysql
下的数据库文件也是可行的一种备份方案。但并不推荐这么做!
mysqldump -u root -p 数据库名 表名1 表名2 > 备份文件名
mysqldump -u root -p -B 数据库名1 数据库名2 > 备份文件名
如下命令需要在mysql中执行
source 备份文件路径
# 示例
source /root/hello.bak.sql;
数据库中的内容和原有数据库是完全相同的
MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| stu_test |
+-----------------+
1 row in set (0.001 sec)
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+
| id | name | age | score |
+----+-----------+------+-------+
| 2 | 小图图 | 5 | 72.80 |
| 3 | 大司马 | 42 | 87.30 |
| 4 | 乐迪 | 32 | 99.00 |
+----+-----------+------+-------+
3 rows in set (0.001 sec)
如果你看过了上面对校验影响的验证,其中我往test_bin数据库中使用6条语句插入了大小写的abc。
但当我们执行备份的时候,可以看到备份出来的sql文件,六个语句被合并了!
INSERT INTO `student` VALUES ('a'),('A'),('b'),('B'),('c'),('C');
这也是mysql备份的智能之处之一!
如下命令需要先进入database才能执行
基础的创建操作如下。其中末尾的字符集、校验规则、存储引擎的设置项可以留空不填
create table 表名 (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
示例如下,创建了一个student表,并配置了两个键值name和age,类型分别为字符串和int
create table student(
name varchar(30),
age int
);
除了基础操作之外,我们还可以给这个表新增一个comment作为备注
create table student(
name varchar(30) comment '学生名字',
age int comment '学生年龄'
);
用下面的语句可以查看创建表时候的操作
show create table 表名;
这部分和备份的时候的sql也是一样的,mysql会帮我们自动规整语句,使其语法规则更规整;
如下语句也能看到创建表时所用命令
show create table stu_test\G
MariaDB [hello]> show create table stu_test\G
*************************** 1. row ***************************
Table: stu_test
Create Table: CREATE TABLE `stu_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`score` decimal(4,2) DEFAULT NULL,
`avatar` varchar(100) NOT NULL DEFAULT 'default-avatar.png' COMMENT '头像图片路径',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.000 sec)
二者结果是类似的
show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| student |
+-----------------+
1 row in set (0.001 sec)
desc 表名;
MariaDB [hello]> desc stu_test;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(30) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | decimal(4,2) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
4 rows in set (0.002 sec)
drop table student;
注意,这里是对表的属性的修改,并不是对数据的修改!
比如我想新增字段,或者修改已有字段的属性,或者删除字段
-- 新增字段
ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column
datatype]...);
-- 修改字段
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column
datatype]...);
-- 删除字段
ALTER TABLE tablename DROP (column);
请注意:修改表的字段是一个很麻烦的操作,其可能会涉及到已有数据的有效性问题
说人话就是,前期设计要想的尽量到位,避免后期表中已有数据的时候修改表的属性!
比如我给上方2.5
中出现过的stu_test
表新增一列,可以用如下的命令
alter table stu_test add avatar varchar(100) comment '头像图片路径' after
score;
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+
| id | name | age | score |
+----+-----------+------+-------+
| 2 | 小图图 | 5 | 72.80 |
| 3 | 大司马 | 42 | 87.30 |
| 4 | 乐迪 | 32 | 99.00 |
| 5 | dc872458 | 25 | NULL |
+----+-----------+------+-------+
4 rows in set (0.000 sec)
MariaDB [hello]> alter table stu_test add avatar varchar(100) comment '头像图片路径' after
-> score;
Query OK, 0 rows affected (0.005 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------+
| id | name | age | score | avatar |
+----+-----------+------+-------+--------+
| 2 | 小图图 | 5 | 72.80 | NULL |
| 3 | 大司马 | 42 | 87.30 | NULL |
| 4 | 乐迪 | 32 | 99.00 | NULL |
| 5 | dc872458 | 25 | NULL | NULL |
+----+-----------+------+-------+--------+
4 rows in set (0.000 sec)
此时可以看到,已有数据都多了一个avatar
字段,且这些已有数据的新字段都为NULL
说明新增字段并不会影响旧数据的旧字段。我们可以在新增字段之后,给旧的数据修改默认值
如果表中的数据只剩一列(只有一个字段)是不能删除这个字段的(只能删除这个表)
使用如下命令,删除刚刚新增的avatar
字段
alter table stu_test drop avatar;
可以看到avatar列被删除了
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------+
| id | name | age | score | avatar |
+----+-----------+------+-------+--------+
| 2 | 小图图 | 5 | 72.80 | NULL |
| 3 | 大司马 | 42 | 87.30 | NULL |
| 4 | 乐迪 | 32 | 99.00 | NULL |
| 5 | dc872458 | 25 | NULL | NULL |
+----+-----------+------+-------+--------+
4 rows in set (0.000 sec)
MariaDB [hello]> alter table stu_test drop avatar;
Query OK, 0 rows affected (0.034 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+
| id | name | age | score |
+----+-----------+------+-------+
| 2 | 小图图 | 5 | 72.80 |
| 3 | 大司马 | 42 | 87.30 |
| 4 | 乐迪 | 32 | 99.00 |
| 5 | dc872458 | 25 | NULL |
+----+-----------+------+-------+
4 rows in set (0.000 sec)
在具体场景中,如果需要给已有用户新增头像
,一般存放的是头像的文件路径(而不是图片),此时我们就可以设计一个默认头像,并在新增字段的时候将默认值(默认的头像文件路径)修改为这个默认头像图片的路径。
比如我现在的头像存储的文件路径是
./images/
此时存放的用户头像文件就应该放到这个目录中,而mysql中只需要存放文件的路径。
比如用户上传了一个头像图片,我们将头像图片保存到这个路径,再往sql中的avatar字段插入路径
./images/test-img.png
sql中只需要保存test-img.png,取图片的时候拼接上前方的文件路径
设计一个默认头像,也是放在这个路径中
./images/test-img.png
./images/default-avatar.png
这时候新增avatar字段的时候,就可以指定默认值
alter table stu_test add avatar varchar(100) not null default 'default-avatar.png' comment '头像图片路径' after
score;
这时候就能看到,旧数据的头像都是默认头像了!
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name | age | score | avatar |
+----+-----------+------+-------+--------------------+
| 2 | 小图图 | 5 | 72.80 | default-avatar.png |
| 3 | 大司马 | 42 | 87.30 | default-avatar.png |
| 4 | 乐迪 | 32 | 99.00 | default-avatar.png |
| 5 | dc872458 | 25 | NULL | default-avatar.png |
+----+-----------+------+-------+--------------------+
4 rows in set (0.000 sec)
默认头像总好过没有图片嘛!
在设计stu_test
表的时候,只给name分配了30个字节的空间。此时如果来了个名字特别特别长的新同学(有些地方的人名确实很长)
我们发现30个字节存不下这个名字了,就可以考虑将名字字段的长度增加
alter table stu_test modify name varchar(60);
如下,成功修改!
MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+--------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(30) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | decimal(4,2) | YES | | NULL | |
| avatar | varchar(100) | NO | | default-avatar.png | |
+--------+--------------+------+-----+--------------------+----------------+
5 rows in set (0.001 sec)
MariaDB [hello]> alter table stu_test modify name varchar(60);
Query OK, 0 rows affected (0.013 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+--------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(60) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | decimal(4,2) | YES | | NULL | |
| avatar | varchar(100) | NO | | default-avatar.png | |
+--------+--------------+------+-----+--------------------+----------------+
5 rows in set (0.001 sec)
因为是增加字段的长度,所以也不影响已有数据
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name | age | score | avatar |
+----+-----------+------+-------+--------------------+
| 2 | 小图图 | 5 | 72.80 | default-avatar.png |
| 3 | 大司马 | 42 | 87.30 | default-avatar.png |
| 4 | 乐迪 | 32 | 99.00 | default-avatar.png |
| 5 | dc872458 | 25 | NULL | default-avatar.png |
+----+-----------+------+-------+--------------------+
4 rows in set (0.000 sec)
如果是减小字段长度,就需要确认已有数据是否有超过新长度的内容了!比如从60减小到30,那么长度为40的数据就会出现错误!
那如果是将varchar直接改成int,或者将int改成char,会发生什么呢?
表中的id字段是一个int,尝试将其修改成char
alter table stu_test modify id varchar(32);
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name | age | score | avatar |
+----+-----------+------+-------+--------------------+
| 2 | 小图图 | 5 | 72.80 | default-avatar.png |
| 3 | 大司马 | 42 | 87.30 | default-avatar.png |
| 4 | 乐迪 | 32 | 99.00 | default-avatar.png |
| 5 | dc872458 | 25 | NULL | default-avatar.png |
+----+-----------+------+-------+--------------------+
4 rows in set (0.001 sec)
MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+--------------------+-------+
| id | varchar(32) | NO | PRI | NULL | |
| name | varchar(60) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | decimal(4,2) | YES | | NULL | |
| avatar | varchar(100) | NO | | default-avatar.png | |
+--------+--------------+------+-----+--------------------+-------+
5 rows in set (0.002 sec)
可以看到,其不仅成功变成了字符串类型,已有的值也没有出错。毕竟int数字改成字符串是可行的。那反过来呢?
MariaDB [hello]> insert into stu_test (id,name,age,score,avatar) values ('kb','你好',30,60,'测试图片.png');
Query OK, 1 row affected (0.007 sec)
MariaDB [hello]> select * from stu_test;
+----+-----------+------+-------+--------------------+
| id | name | age | score | avatar |
+----+-----------+------+-------+--------------------+
| 2 | 小图图 | 5 | 72.80 | default-avatar.png |
| 3 | 大司马 | 42 | 87.30 | default-avatar.png |
| 4 | 乐迪 | 32 | 99.00 | default-avatar.png |
| 5 | dc872458 | 25 | NULL | default-avatar.png |
| kb | 你好 | 30 | 60.00 | 测试图片.png |
+----+-----------+------+-------+--------------------+
5 rows in set (0.000 sec)
此时我往表中插入了一个id为kb
的数据,再尝试将id从varchar改回int类型
MariaDB [hello]> alter table stu_test modify id int;
ERROR 1292 (22007): Truncated incorrect INTEGER value: 'kb'
MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+--------------------+-------+
| id | varchar(32) | NO | PRI | NULL | |
| name | varchar(60) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | decimal(4,2) | YES | | NULL | |
| avatar | varchar(100) | NO | | default-avatar.png | |
+--------+--------------+------+-----+--------------------+-------+
5 rows in set (0.001 sec)
此时就会报错,kb
不符合int类型;修改失败了!
所以,修改字段的类型,需要保证原有类型和目标类型之间是可以正常双向转换的!
如下使用change
修改字段id -> num
,同时还需要注明属性(也可以修改属性)
alter table stu_test change id num varchar(32);
这里可以看到 0 rows affected
,因为我们修改的是字段名字而已,所以不会影响到数据
MariaDB [hello]> alter table stu_test change id num varchar(32);
Query OK, 0 rows affected (0.008 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [hello]> desc stu_test;
+--------+--------------+------+-----+--------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+--------------------+-------+
| num | varchar(32) | NO | PRI | NULL | |
| name | varchar(60) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| score | decimal(4,2) | YES | | NULL | |
| avatar | varchar(100) | NO | | default-avatar.png | |
+--------+--------------+------+-----+--------------------+-------+
5 rows in set (0.001 sec)
alter table stu_test rename stu;
可以看到修改成功了
MariaDB [hello]> alter table stu_test rename stu;
Query OK, 0 rows affected (0.015 sec)
MariaDB [hello]> show tables;
+-----------------+
| Tables_in_hello |
+-----------------+
| stu |
| tb_video |
+-----------------+
2 rows in set (0.000 sec)
往刚刚创建的students表里面插入两个数据
insert into student (name,age) value ('牛爷爷',50);
insert into student (name,age) value ('图图',9);
查看表中数据
select * from student;
+-----------+------+
| name | age |
+-----------+------+
| 牛爷爷 | 50 |
| 图图 | 9 |
+-----------+------+
2 rows in set (0.001 sec)
select * from student;
该语句作用为查看student表中的所有值
MariaDB [test_bin]> select * from student;
+------+
| name |
+------+
| a |
| A |
| b |
| B |
| c |
| C |
+------+
6 rows in set (0.001 sec)