MySQL:修订间差异
无编辑摘要 |
无编辑摘要 |
||
第93行: | 第93行: | ||
===类型=== | ===类型=== | ||
{| class="wikitable" style="width: 100%; | {| class="wikitable" style="width: 100%; | ||
! 类别 | |||
! 类型 | ! 类型 | ||
! 描述 | ! 描述 | ||
! 示例 | ! 示例 | ||
|- | |- | ||
| rowspan=" | | rowspan="8"|[https://dev.mysql.com/doc/refman/8.0/en/string-types.html 字符串] | ||
| CHAR(n) | | CHAR(n) | ||
| | | 固定长度字符串。 | ||
| CHAR(10) | | CHAR(10) | ||
|- | |- | ||
| VARCHAR(n) | |||
| 可变长度字符 | | 可变长度字符 | ||
| VARCHAR(150) | | VARCHAR(150) | ||
|- | |- | ||
| | | TINYTEXT | ||
| 字符串大对象 | |||
| | |||
|- | |||
| TEXT | | TEXT | ||
| 字符串大对象 | |||
| | | | ||
|- | |||
| MEDIUMTEXT | |||
| 字符串大对象 | |||
| | |||
|- | |||
| LONGTEXT | |||
| 字符串大对象 | |||
| | | | ||
|- | |- | ||
| ENUM | |||
| 枚举 | | 枚举 | ||
| | | | ||
|- | |- | ||
| SET | |||
| 集合 | | 集合 | ||
| | | | ||
|- | |- | ||
| rowspan=" | | rowspan="6"|二进制字符串 | ||
| BINARY(n) | |||
| 二进制 | | 二进制 | ||
| BINARY(10) | | BINARY(10) | ||
|- | |- | ||
| VARBINARY(n) | |||
| 可变长度二进制 | | 可变长度二进制 | ||
| VARBINARY(200) | | VARBINARY(200) | ||
|- | |- | ||
| TINYBLOB | |||
| 二进制大对象 | | 二进制大对象 | ||
| | |||
|- | |||
| BLOB | | BLOB | ||
| 二进制大对象 | |||
| BLOB | |||
|- | |||
| MEDIUMBLOB | |||
| 二进制大对象 | |||
| | | | ||
| | |- | ||
| LONGBLOB | |||
| 二进制大对象 | |||
| | |||
|- | |- | ||
| rowspan="7"|[https://dev.mysql.com/doc/refman/8.0/en/numeric-types.html 准确数值] | | rowspan="7"|[https://dev.mysql.com/doc/refman/8.0/en/numeric-types.html 准确数值] | ||
| TINYINT | | TINYINT | ||
| | | 微型整数,非标准SQL。占1字节,范围:无符号0~255,有符号-128~127。MySQL没有定义布尔类型(BOOL,BOOLEAN),使用TINYINT(1)表示,0表示false,非零表示true。 | ||
| | | | ||
|- | |- | ||
| SMALLINT | | SMALLINT | ||
| | | 小型整数,非标准SQL。占2字节, | ||
| SMALLINT | | SMALLINT | ||
|- | |- | ||
| MEDIUMINT | | MEDIUMINT | ||
| | | 中型整数,非标准SQL。占3字节, | ||
| MEDIUMINT | | MEDIUMINT | ||
|- | |- | ||
| INTEGER, INT | | INTEGER, INT | ||
| | | 整数,占4字节,范围:无符号0~4294967295,有符号-2147483648~2147483647 | ||
| INTEGER | | INTEGER | ||
|- | |- | ||
| BIGINT | | BIGINT | ||
| | | 大型整数,非标准SQL。占8字节,范围:无符号0~ 2^64-1,有符号-2^63~2^63 | ||
| BIGINT | | BIGINT | ||
|- | |- | ||
| NUMERIC(p,s) | | NUMERIC(p,s) | ||
| | | 带固定精度和小数位数的数值。p(precision)表示整数和小数的总位数,s(scale)表示小数位数,p和s都可以省略。 | ||
| NUMERIC(5,2) | | NUMERIC(5,2) | ||
|- | |- | ||
| DECIMAL(p,s) | | DECIMAL(p,s) | ||
| | | 带固定精度和小数位数的数值,p(precision)表示整数和小数的总位数,s(scale)表示小数位数,p和s都可以省略。 | ||
| DECIMAL(5,2) | | DECIMAL(5,2) | ||
|- | |- | ||
| rowspan="3"|[https://dev.mysql.com/doc/refman/8.0/en/numeric-types.html 近似数值] | | rowspan="3"|[https://dev.mysql.com/doc/refman/8.0/en/numeric-types.html 近似数值] | ||
| FLOAT(p) | |||
| 浮点数 | | 浮点数 | ||
| FLOAT(3) | | FLOAT(3) | ||
|- | |- | ||
| REAL | |||
| 单精度浮点数 | | 单精度浮点数 | ||
| REAL | | REAL | ||
|- | |- | ||
| DOUBLE | |||
| 双精度 | | 双精度 | ||
| DOUBLE | | DOUBLE | ||
|- | |- | ||
| rowspan="5"|[https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html 日期时间] | | rowspan="5"|[https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html 日期时间] | ||
| DATE(p) | |||
| 日期 | | 日期 | ||
| DATE | | DATE | ||
|- | |- | ||
| DATETIME[(p)] | | DATETIME[(p)] | ||
| | | 日期和时间。支持的范围是 '1000-01-01 00:00:00.000000'到 '9999-12-31 23:59:59.999999'。 | ||
| DATE | | DATE | ||
|- | |- | ||
| TIME(p) | |||
| 时间 | | 时间 | ||
| TIME | | TIME | ||
|- | |- | ||
| TIMESTAMP(p) | |||
| 时间戳 | | 时间戳 | ||
| TIMESTAMP(9) | | TIMESTAMP(9) | ||
|- | |- | ||
| INTERVAL | |||
| 时间间隔 | | 时间间隔 | ||
| INTERVAL YEAR TO MONTH | | INTERVAL YEAR TO MONTH | ||
|- | |- | ||
| rowspan="1"|JSON | | rowspan="1"|JSON | ||
| | | JSON | ||
| JSON | | JSON | ||
| | | | ||
|- | |- | ||
| rowspan="1"|空间数据 | | rowspan="1"|空间数据 | ||
| geom | | geom | ||
| | | 空间数据 | ||
| | | | ||
|} | |} | ||
2022年1月10日 (一) 16:13的版本
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) | 固定长度字符串。 | CHAR(10) |
VARCHAR(n) | 可变长度字符 | VARCHAR(150) | |
TINYTEXT | 字符串大对象 | ||
TEXT | 字符串大对象 | ||
MEDIUMTEXT | 字符串大对象 | ||
LONGTEXT | 字符串大对象 | ||
ENUM | 枚举 | ||
SET | 集合 | ||
二进制字符串 | BINARY(n) | 二进制 | BINARY(10) |
VARBINARY(n) | 可变长度二进制 | VARBINARY(200) | |
TINYBLOB | 二进制大对象 | ||
BLOB | 二进制大对象 | BLOB | |
MEDIUMBLOB | 二进制大对象 | ||
LONGBLOB | 二进制大对象 | ||
准确数值 | 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的数据类型。可以在表定义时使用这些类型,如:
-- 定义一个表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; |
数据表操作
数据操作 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
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目录即可导入。