MySQL

Eric讨论 | 贡献2022年1月8日 (六) 17:33的版本

MySQL,一个开放源码的关系数据库管理系统,读作“My S-Q-L”。MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库。但被甲骨文公司收购后,大幅调涨MySQL商业版的售价,且甲骨文公司不再支持另一个自由软件项目OpenSolaris的发展,MySQL的创始人麦克尔·维德纽斯以MySQL为基础,成立分支计划MariaDB。而原先一些使用MySQL的开源软件逐渐转向MariaDB或其它的数据库。例如维基百科已于2013年正式宣布将从MySQL迁移到MariaDB数据库。

简介

时间轴

  • 2008年1月16日,Sun(太阳微系统)正式收购MySQL。
  • 2009年4月20日,甲骨文公司宣布以每股9.50美元,74亿美元的总额收购Sun电脑公司。
  • 2013年6月18日,甲骨文公司修改MySQL授权协议,移除了GPL。但随后有消息称这是一个bug。

安装

使用Docker安装

安装Docker,然后直接从官网镜像启动一个mysql容器,并设置root用户密码为123456。

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

了解更多 >> Docker Hub:MySQL


Ubuntu上安装

#更新软件源
sudo apt-get update 

#
sudo apt-get install mysql-server

了解更多 >> MySQL文档:使用APT仓库安装


可能遇到问题

  • 主机只有1G内存,mysql却占用很大内存。

在终端输入top查看各程序cup和内存等占用率,然后输入M,使结果按内存大小排序,可以看到mysqld的占用率高。直接修改mysql服务器的配置文件my.cnf,如果使用mysql容器,先进入容器终端。

#进入某个容器
docker exec -it some-mysql bash
#在容器内安装vim
apt-get update
apt-get install vim

#打开并修改my.cnf文件
vim /etc/mysql/my.cnf
#在文件里加入如下配置
performance_schema_max_table_instances=400  
table_definition_cache=400  
table_open_cache=256
performance_schema = off

#重启mysql
service mysql stop
service mysql start
#输入exit,退出容器,然后重启该容器
docker restart some-mysql 
#用top命令查看内存占用率
  • 错误:ERROR 1698 (28000): Access denied for user 'root'@'localhost'


客户端

名称 界面 描述
MySQL客户端程序 命令 免费。
MySQL客户端程序包含:
mysql 命令行客户端
mysqldump 数据库备份程序
mysqladmin 服务器管理程序
...
Navicat 图形 收费,简单易用,可用于多种数据库管理
SQLyog 图形 收费,简单易用
DBeaver 图形 免费,开源
MySQL Workbench 图形 免费,开源,MySQL官方工具
VS Code插件MySQL 图形 免费,开源。一款VS Code中的插件,作者cweijan。支持多种数据库,使用简单方便。

了解更多 >> MySQL 文档:MySQL程序 - 客户端程序


数据类型

概览

类型

类型 子类 格式 描述 示例
字符串 字符 CHAR(n) 固定n长度的字符 CHAR(10)
可变长度字符 VARCHAR(n) 可变长度字符,最长为n VARCHAR(150)
字符大对象 TEXT
枚举 ENUM
集合 SET
二进制字符串 二进制 BINARY(n) BINARY(10)
可变长度二进制 VARBINARY(n) VARBINARY(200)
二进制大对象 BLOB BLOB
准确数值 微型整数 TINYINT 非标准SQL。占1字节,范围:无符号0~255,有符号-128~127。MySQL没有定义布尔类型(BOOL,BOOLEAN),使用TINYINT(1)表示,0表示false,非零表示true。
小型整数 SMALLINT 非标准SQL。占2字节, SMALLINT
中型整数 MEDIUMINT 非标准SQL。占3字节, MEDIUMINT
整数 INTEGER, INT 占4字节,范围:无符号0~4294967295,有符号-2147483648~2147483647 INTEGER
大型整数 BIGINT 非标准SQL。占8字节,范围:无符号0~ 2^64-1,有符号-2^63~2^63 BIGINT
带固定精度和小数位数的数值 NUMERIC(p,s) p(precision)表示整数和小数的总位数,s(scale)表示小数位数,p和s都可以省略。 NUMERIC(5,2)
带固定精度和小数位数的数值 DECIMAL(p,s) p(precision)表示整数和小数的总位数,s(scale)表示小数位数,p和s都可以省略。 DECIMAL(5,2)
近似数值 浮点数 FLOAT(p) FLOAT(3)
单精度浮点数 REAL REAL
双精度 DOUBLE DOUBLE
日期时间 日期 DATE(p) DATE
日期时间 DATETIME[(p)] 日期和时间的组合。支持的范围是 '1000-01-01 00:00:00.000000'到 '9999-12-31 23:59:59.999999'。 DATE
时间 TIME(p) TIME
时间戳 TIMESTAMP(p) TIMESTAMP(9)
时间间隔 INTERVAL INTERVAL YEAR TO MONTH
JSON - JSON JSON
空间数据 - geom


了解更多 >> MySQL 文档:数据类型 MySQL 文档:使用来自其他数据库引擎的数据类型


转换

MySQL可以自动转换其他数据库的某些数据类型到MySQL的数据类型。可以在表定义时使用这些类型,如:

-- 定义一个表t1
CREATE TABLE t1 (id int3, is_ok BOOL);

-- 查看数据表定义可知,已经转换为MySQL类型
desc t1;
其他数据库类型 MySQL 类型
BOOL TINYINT
BOOLEAN TINYINT
CHARACTER VARYING(M) VARCHAR(M)
FIXED DECIMAL
FLOAT4 FLOAT
FLOAT8 DOUBLE
INT1 TINYINT
INT2 SMALLINT
INT3 MEDIUMINT
INT4 INT
INT8 BIGINT
LONG VARBINARY MEDIUMBLOB
LONG VARCHAR MEDIUMTEXT
LONG MEDIUMTEXT
MIDDLEINT MEDIUMINT
NUMERIC DECIMAL

了解更多 >> MySQL 文档:使用来自其他数据库引擎的数据类型


SQL语句

基础语法

数据库操作

名称 常用语句 描述 示例
创建数据库
create database
create database 数据库名;

create database if not exists 数据库名;

create database 数据库名 character set 字符集;
创建指定名称的数据库。character set 用于指定字符集,SHOW CHARACTER SET语句显示所有可用的字符集。

创建一个数据库,MySQL会在数据目录下创建一个同名的目录。MySQL 对数据库的数量没有限制。
CREATE DATABASE db1; 创建名称为db1的数据库。
CREATE DATABASE db2 CHARACTER SET utf8; 创建数据库db2,并指定utf8字符集。
查看所有数据库
show databases
show databases;

show databases like '模式';
显示MySQL中的数据库。 show databases; 显示所有数据库。
show databases like 'my%'; 显示所有以my开头的数据库。
使用数据库
use
use 数据库; 当前语句执行的默认数据库。

USE db1;接下来所有操作默认在db1数据库中,SELECT * FROM table1;是从db1.table1表查询,要使用其他数据库的表需要指定数据库名如db2.table1
USE db2; 切换到db2数据库。
查看当前数据库 select database(); 查看当前语句执行的默认数据库。 select database();
查看数据库定义 show create database 数据库; 查看一个数据库的定义信息。 SHOW CREATE DATABASE db1;
修改数据库
alter database
alter database 数据库 character set 字符集;

alter database 数据库 read only = {DEFAULT | 0 | 1}
修改数据库。

character set 修改字符集
read only 修改是否只读。8.0.22版本新增。
ALTER DATABASE db1 CHARACTER SET utf8; 修改数据库db1的字符集为utf8。
ALTER DATABASE db1 READ ONLY = 1 修改数据库db1为只读。
删除数据库
drop database
drop database 数据库;
drop database if exists 数据库;
删除数据库。需要非常小心,所有该数据库及其所有表都将删除。if exists 可防止数据库不存在而报错。 DROP DATABASE db1;

了解更多 >> MySQL 文档:数据定义语句 MySQL 文档:教程 - 创建和使用数据库


数据表操作

数据操作 DML

数据查询 DQL

数据控制 DCL

导入导出

导入

导入工具 支持格式 描述
LOAD DATA 语句 CSV等 SQL语句 LOAD DATA用于加载数据文本类型数据。示例:

当需要导入大量本地数据到mysql数据库时,可使用LOAD DATA LOCAL INFILE命令。但local_infile选项默认关闭状态,需要打开。以下以导入5千万行CSV文件为例。
-- mysql8.0以上版本,命令行登录数据库时,使用如下命令
-- mysql -u root -p --local-infile

-- 查看'local_infile'选项,并设置为ON
show variables like 'local_infile';
set global local_infile=on;

-- 建test表
CREATE TABLE test( 
  user_id INT, 
  name VARCHAR);

-- 导入本地csv文件,如果第一行有标题使用IGNORE 1 LINES忽略
LOAD DATA LOCAL INFILE 'C:\\Users\\TESTWORK\\Desktop\\test_data.csv'
INTO TABLE test
FIELDS TERMINATED BY ','
IGNORE 1 LINES;
mysqlimport CSV等 mysqlimport工具是LOAD DATA 语句的命令行接口
mysqldump SQL语句 mysqldump工具用于备份,可以导出和导入sql语句。

导出

常见问题

使用LOAD DATA INFILE加载CSV文件时,空值(NULL)会自动变为0。

空值和0不同,如在计算均值时,空值不会纳入计算,0值会增加个数。两种方法:

  • 方法1:导入时使用NULLIF()函数进行预处理
-- 示例,对name列的空值进行预处理
-- 也可以全部例进行预处理,但最后一列好像不起作用?

LOAD DATA INFILE '/data/testdata.csv'
INTO TABLE book
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(id, @name, author) 
SET name = NULLIF(@name,'')
;
  • 方法2:对csv文件进行预处理,空值处插入转义字符\N会自动转为NULL,如某行15, ,10,改为15,\N,10

了解更多 >> stackoverflow:MySQL从CSV数据加载NULL值 MySQL 文档:空值的问题 MySQL 文档:Load Data 语句


LOAD DATA INFILE时报错。 
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

SHOW VARIABLES LIKE "secure_file_priv";

  • 方法1:查询secure_file_priv值 SHOW VARIABLES LIKE "secure_file_priv"; ,如果存在目录,将文件移动到该安全目录即可导入。
  • 方法2:配置secure_file_priv值,如ubuntu中可以编辑/etc/mysql/my.cnf配置文件,设置secure-file-priv= /data,重启mysql服务即可,docker可以直接重启容器。将文件放入/data目录即可导入。

了解更多 >> stackoverflow:MySQL ERROR 1290 (HY000) --secure-file-priv option


资源

官网

教程

网页