我是靠谱客的博主 爱笑小鸽子,最近开发中收集的这篇文章主要介绍MySQL 数据类型、字符集编码、存储引擎MySQL 数据类型 - 字符串MySQL 数据类型 - 整数值MySQL 数据类型 - 浮点数、定点型MySQL 数据类型 - 日期与时间MySQL 字符集编码Mysql 存储引擎概述查看 Mysql 数据库存储引擎修改 MySQL 数据库存储引擎查看 Mysql 数据表存储引擎修改 Mysql 数据表存储引擎,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

MySQL 数据类型 - 字符串

MySQL 数据类型 - 整数值

MySQL 数据类型 - 浮点数、定点型

MySQL 数据类型 - 日期与时间

MySQL 字符集编码

Mysql 存储引擎概述

查看 Mysql 数据库存储引擎

修改 MySQL 数据库存储引擎

查看 Mysql 数据表存储引擎

修改 Mysql 数据表存储引擎


1、MySQL 支持几种类型的SQL数据类型:数字类型、日期和时间类型、字符串(字符和字节)类型、空间类型和JSON数据类型

2、Mysql 8.0 官网参考手册:Data Types(数据类型)

3、sql/mysql/新建 dept、emp 表.sql · 汪少棠/material - Gitee.com

MySQL 数据类型 - 字符串

类型说明范围
char(m)定长字符串[0,255] 个字符
varchar(m)变长字符串[0,65535]个字符(与具体字符编码有关,大约 2w-6w 个字符)
text大文本约 2w-6w 个字符(与具体字符编码有关)
与 oracle 不同,mysql 约定的是字符个数,而 oracle 约定是字节个数,比如同样是 m 等于3,mysql 可以插入3个汉字,而 oracle 却只能插入1个汉字,因为 utf-8 编码时,一个汉字占3个字节.

1、VARCHAR、BLOB 和 TEXT 类是变长类型,每个类型的存储需求取决于列值的实际长度。

2、text 大文本:存储内容长度基本与 varchar 一致,text 搜索速度稍慢,且无法设置默认值(设置了也没用),如果不是特别大的内容,建议使用 varchar.

DROP TABLE IF EXISTS dept1;
CREATE TABLE dept1 (
deptno INT NOT NULL AUTO_INCREMENT COMMENT '部门编号',
card1 CHAR(8) NOT NULL DEFAULT '-',
card2 VARCHAR(8) NOT NULL DEFAULT '-',
-- text 大文本不能设置默认值
card3 text NOT NULL,
PRIMARY KEY (deptno)
);
INSERT INTO dept1 (card1, card2, card3) VALUES ('南朝四百八十寺,', '多少楼台烟雨中。','万里长城今犹在,不见当年秦始皇。');
INSERT INTO dept1 (card3) VALUES ('万里长城今犹在,不见当年秦始皇。');
-- 1	南朝四百八十寺,	多少楼台烟雨中。	万里长城今犹在,不见当年秦始皇。
-- 2	-	-	万里长城今犹在,不见当年秦始皇。
SELECT deptno,card1,card2,card3 FROM dept1; 

MySQL 数据类型 - 整数值

1、整数类型根据数值取值范围不同,可以分为五种,分别为 tinyint、smallint、mediumint、int 和 bigint。

类型占用字节无符号范围(UNSIGNED标识无符号)有符号范围(默认为有符号)
tinyint10-255-128-127
smallint20-65535-32768~32767
mediumint30~16777215-8388608~8388607
int40~4294967295-2147483648~2147483647
bigint80~18446744073709551615-9223372036854755808~9223372036854775807
DROP TABLE IF EXISTS dept2;
CREATE TABLE dept2 (
deptno INT NOT NULL AUTO_INCREMENT COMMENT '部门编号',
-- 默认是有符号型整数
card1 TINYINT NOT NULL DEFAULT 0,
-- 有符号短整形,范围[-128-127],不能为空,默认为 0
card2 TINYINT UNSIGNED NOT NULL DEFAULT 0,
-- 无符号短整形,范围[0-255],不能为空,默认为 0
PRIMARY KEY (deptno)
);
INSERT INTO dept2 (card1, card2) VALUES (- 127, 255);
SELECT deptno,card1,card2 FROM dept2; -- 1	-127	255

MySQL 数据类型 - 浮点数、定点型

类型大小范围(有符号)范围(无符号)

float(m,d)

4 字节(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)

double(m,d)

8 字节(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)

decimal(m,d)

对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值
DROP TABLE IF EXISTS dept3;
CREATE TABLE dept3 (
deptno INT NOT NULL AUTO_INCREMENT COMMENT '部门编号',
-- 默认是有符号的
price1 FLOAT(6,2) NOT NULL DEFAULT 0.0,
price2 DOUBLE(6,2) UNSIGNED NOT NULL DEFAULT 0.0,
price3 DECIMAL(6,2) NOT NULL DEFAULT 0.0,
-- DECIMAL 不指定长度和精度时,默认为 (10,0)
price4 FLOAT NOT NULL DEFAULT 0.0,
price5 DOUBLE NOT NULL DEFAULT 0.0,
price6 DECIMAL NOT NULL DEFAULT 0.0,
PRIMARY KEY (deptno)
);
INSERT INTO dept3 (price1, price2, price3, price4, price5, price6) VALUES (9855.5377, 9855.5377, 9855.5377,9855.5377,9855.5377,9855.5377);
INSERT INTO dept3 () VALUES ();
-- 1	9855.54	9855.54	9855.54	9855.54	9855.5377	9856
-- 2	0	0	0	0	0	0
SELECT deptno, price1, price2, price3, price4, price5, price6 FROM dept3; 

MySQL 数据类型 - 日期与时间

1、Msql 日期和时间数据类型为:日期(date)、时间(time)、日期时间(datetime)、时间戳(timestamp)和年份(year)。

2、MySQL 允许时间、日期时间和时间戳值的小数秒精度高达微秒(6位),要定义包含小数秒部分的列,请使用语法 type_name(fsp),其中 type_name 是时间、日期时间或时间戳,fsp 是小数秒精度。

3、fsp 精度值(如果给定)必须在0到6之间,值为0表示没有小数部分,如果省略,默认精度为0。

类型描述范围
date以"YYYY-MM-DD"格式显示日期值,但允许使用字符串或数字为日期列赋值["1000-01-01","9999-12-31"]
DATETIME[(fsp)]日期和时间的组合,以 "YYYY-MM-DD hh:MM:ss[.fraction]" 格式显示日期时间值,但允许使用字符串或数字将值分配给日期时间列。["1000-01-01 00:00:00.000000", "9999-12-31 23:59:59.99999"]
TIMESTAMP[(fsp)]时间戳值存储为自纪元(“1970-01-01 00:00:00”UTC)起的秒数'1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999'
TIME[(fsp)]一段时间,以 "hh:mm:ss[.fraction]"格式显示时间值,但允许使用字符串或数字为时间列赋值。["-838:59:59.000000","838:59:59.000000"]
YEAR[(4)]4位数格式的年份,以 YYYY 格式显示年份值,但允许使用字符串或数字将值分配给年份列。值显示为[1901,2155] 或 0000.
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
d1 DATE NOT NULL DEFAULT '1900-01-01',
dt1 datetime NOT NULL DEFAULT '1900-01-01 00:00:00',
dt2 datetime(4) NOT NULL DEFAULT '1900-01-01 00:00:00.0000',
ts1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ,
t1 time NOT NULL DEFAULT '00:00:00',
t2 TIME(4) NOT NULL DEFAULT '00:00:00.0000',
y YEAR NOT NULL DEFAULT '1990',
PRIMARY KEY(id)
);
-- 与 oracle 不同,mysql 可以直接按照约定格式进行插入,不需要通过函数转换
INSERT INTO t1(d1,dt1,dt2,ts1,t1,t2,y) VALUES('1993-08-25','1993-08-25 14:55:45','1993-08-25 18:25:45.8545','1993-08-25 13:25:25.66','16:00:45','16:00:45.4500','1993');
INSERT INTO t1() VALUES();
-- 1	1993-08-25	1993-08-25 14:55:45	1993-08-25 18:25:45.8545	1993-08-25 13:25:26	16:00:45	16:00:45.4500	1993
-- 2	1900-01-01	1900-01-01 00:00:00	1900-01-01 00:00:00.0000	2021-09-22 12:20:05	00:00:00	00:00:00.0000	1990
SELECT id,d1,dt1,dt2,ts1,t1,t2,y from t1;

MySQL 字符集编码

一:UTF-8 问题背景:如果 mysql 数据库的编码为 UTF-8 ,则会有一些问题,比如存储一些如表情符号的内容会报错,解决办法是需要修改 Mysql 编码为 utf8mb4 。

二:UTF-8 问题原因

1、Mysql 中的 "utf-8" 编码只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节,对于表情包、一些较复杂的文字、以及繁体字都是占用 4 字节,所以会导致失败

2、Mysql 官方并没有直接修改 UTF-8 编码以适应单个字符 4 字节长度的存储,而是新增了一个 utf8mb4 编码来解决这个问题。

3、utf8mb4 兼容 utf8,且比 utf8 能表示更多的字符,是 utf8 字符集的超集,所以将现有的 msyql 数据库直接升级为 utf8mb4 编码是可以的,而且使用 Mysql 的项目,mysql 数据库推荐使用 utf8mb4 编码,而不是 UTF-8 。

4、utf8mb4 是 MySQL5.5.3 版本之后支持的字符集。

5、MySQL 中可以为整个数据库设置编码,也可以为一张表设置字符编码,甚至可以为表中的某一列设置字符编码。

INSERT INTO dept (deptno, dname, loc) VALUES (33, '预算开发部', '长沙麓谷????');
-- 当 mysql 数据库编码为 UTF-8 ,插入上面数据时,报错如下:
-- Incorrect string value: 'xF0x9Fx98x93' for column 'loc' at row 1

三:查看字符编码

-- 查看当前 mysql 系统默认的字符集设置
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
show create database test;-- 查看某个数据库的字符编码
SHOW CREATE TABLE dept;-- 查看某张表的字符编码
show full columns from dept;-- 查看某张表中某列的字符编码

四:修改字符编码

1、对已经存在的数据库以及表,可以直接修改它们的字符编码,如下所示修改 test 数据库和 dept 表。

-- 修改当前已经存在的 数据库 的字符集编码,修改以后,新建的表就会是新的字符编码,但是已经存在的表仍然是旧编码
-- character:表示字符编码,collate:表示排序规则
alter database test character set = utf8mb4 collate = utf8mb4_bin;
-- 修改已经存在的表及其列的字符编码
alter table dept convert to character set utf8mb4 collate utf8mb4_bin;

五:创建数据库与表时指定字符编码

1、可以在新建数据库或者表时指定字符串编码。

--
创建数据库 db_wmx,数据库使用 utf8mb4
编码, utf8mb4_bin排序规则
create database if not exists db_wmx character set utf8mb4 collate utf8mb4_bin;
-- 创建表(字符编码、排序规则、存储引擎不写时默认与数据库保存一致)
DROP TABLE IF EXISTS dept;
CREATE TABLE dept (
deptno int(11) NOT NULL AUTO_INCREMENT COMMENT '部门编号',
dname varchar(14) DEFAULT NULL COMMENT '部门名称',
loc varchar(13) DEFAULT NULL COMMENT '部门所在位置',
PRIMARY KEY (deptno)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ENGINE INNODB ;

Mysql 存储引擎概述

1、存储引擎通俗的说就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。

2、因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。

3、Oracle 和 SQL Server 等数据库只有一种存储引擎,所有数据存储管理机制都是一样的;而MySql数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

4、如下所示为 Mysql 8.0 提供的存储引擎,默认存储引擎为 InnoDB:

MyISAM

0、MyISAM 引擎是 MySQL 5.1 及之前版本的默认引擎,它的特点是:

1)不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁

2)不支持事务

3)不支持外键

4)不支持崩溃后的安全恢复

5)在表有读取查询的同时,支持往表中插入新纪录

6)支持 BLOB 和 TEXT 的前500个字符索引,支持全文索引

7)支持延迟更新索引,极大提升写入性能

8)对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用

InnoDB

1、InnoDB 在 MySQL 5.5 及以后成为默认索引,它的特点是:

1.1)支持行锁,采用 MVCC 来支持高并发

1.2)支持事务

1.3)支持外键

1.4)支持崩溃后的安全恢复

1.5)不支持全文索引

1.6)InnoDB 是一个事务型存储引擎,为用户操作非常大的数据存储提供了一个强大的解决方案,已经被很多互联网公司使用。

2、在以下场合下,使用InnoDB是最理想的选择:

2.1)更新密集的表:InnoDB存储引擎特别适合处理多重并发的更新请求。

2.2)事务:InnoDB 存储引擎是支持事务的标准MySQL存储引擎。

2.3)自动灾难恢复:与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。

2.4)外键约束:MySQL支持外键的存储引擎只有InnoDB。

2.5)支持自动增加列 AUTO_INCREMENT 属性。

查看 Mysql 数据库存储引擎

1、查询当前数据库支持哪些存储引擎,以及数据库当前默认使用的是哪种存储引擎

一:查询数据库支持的存储引擎show engines;

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine
| Support | Comment
| Transactions | XA
| Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MEMORY
| YES
| Hash based, stored in memory, useful for temporary tables
| NO
| NO
| NO
|
| MRG_MYISAM
| YES
| Collection of identical MyISAM tables
| NO
| NO
| NO
|
| CSV
| YES
| CSV storage engine
| NO
| NO
| NO
|
| FEDERATED
| NO
| Federated MySQL storage engine
| NULL
| NULL | NULL
|
| PERFORMANCE_SCHEMA | YES
| Performance Schema
| NO
| NO
| NO
|
| MyISAM
| YES
| MyISAM storage engine
| NO
| NO
| NO
|
| InnoDB
| DEFAULT | Supports transactions, row-level locking, and foreign keys
| YES
| YES
| YES
|
| BLACKHOLE
| YES
| /dev/null storage engine (anything you write to it disappears) | NO
| NO
| NO
|
| ARCHIVE
| YES
| Archive storage engine
| NO
| NO
| NO
|
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

Support 列: YES表示当前版本支持这个存储引擎;DEFAULT 表示该引擎是数据库当前使用的引擎;NO表示不支持该存储引擎。

二:查询数据库当前使用的存储引擎:show variables like '%storage_engine%';

查看系统变量 default_storage_engine 或 storage_engine 来查看数据库当前使用的存储引擎

mysql> show variables like '%storage_engine%';
+---------------------------------+-----------+
| Variable_name
| Value
|
+---------------------------------+-----------+
| default_storage_engine
| InnoDB
|
| default_tmp_storage_engine
| InnoDB
|
| disabled_storage_engines
|
|
| internal_tmp_mem_storage_engine | TempTable |
+---------------------------------+-----------+
4 rows in set, 1 warning (0.03 sec)

-- 根据 MySQL 数据库具体版本的不同,查询的结果可能会略有差异,主要结果如下:

1)default_storage_engine:表示永久表(permanent tables)的默认存储引擎。
2)default_tmp_storage_engine:表示临时表的默认存储引擎。
3)storage_engine:数据库当前使用的存储引擎

修改 MySQL 数据库存储引擎

1、Java 开发其实主要就是使用 InnoDB 存储引擎,因为需要它支持事务以及设置外键等操作

2、实际开发中也会出现安装了不同版本的 MySQL后,像平时一样使用 Navicat 为数据库表设置外键时,发现居然一点保存就自动消失了,反正就是死活不成功,后面一查才发现数据库使用的是MyISAM 存储引擎。

3、修改 MySQL 存储引擎后,无论 MySQL 是否重新启动服务,都会永久修改,想要采用哪种存储引擎时,则只需修改为对应的值即可。

5、注意:如果数据库之前使用的是 MyISAM 存储引擎,现在改为了INNODB,则数据库之前所建的表仍然采用的是之前的MyISAM 存储引擎,后面新建的表则会重新采用新的 INNODB 存储引擎

第一步:先停掉 Mysql 服务.

第二步:

1、linux 系统中:找到 /etc/my.cnf,修改配置文件中的:default-storage-engine=InnoDB(没有时,增加即可)

2、windowns 系统中:找到安装目录 /mysql/my.ini,修改配置文件:default-storage-engine=InnoODB(没有时,增加即可)

第三步:修改完配置文件后,再重新启动 MySQL 服务。

第四步:重新连接数据库,再次查看数据库当前默认的存储引擎,就会发现已经是新的了。

查看 Mysql 数据表存储引擎

1、采用常用的语句:"show create table 表名;"   即可进行查看

2、注意:如果数据库之前使用的是 MyISAM 存储引擎,现在改为了INNODB,则数据库之前所建的表仍然采用的是之前的MyISAM 存储引擎,后面新建的表则会重新采用新的INNODB存储引擎

修改 Mysql 数据表存储引擎

1、通常有以下两种情况需要“修改某张表的存储引擎”

1)假如数据库默认为"MyISAM"存储引擎,现在想要修改其中某张表为“InnoDB”
2)或者是例如数据库默认存储引擎由原来的"MyISAM"修改为了“InnoDB”,现在想要将数据库中的所有或者部分表也要由原来的"MyISAM"修改为了“InnoDB”

2、修改语句为:"alter table 表名 engine=innodb;"

mysql> alter table dept3 engine=Innodb;
Query OK, 2 rows affected (0.43 sec)
Records: 2
Duplicates: 0
Warnings: 0
mysql> show create table dept3;
+-------+--------------------------------------------------------------+
| Table | Create Table
|
+-------+--------------------------------------------------------------+
| dept3 | CREATE TABLE `dept3` (
`deptno` int NOT NULL AUTO_INCREMENT COMMENT '部门编号',
`price1` float(6,2) NOT NULL DEFAULT '0.00',
`price2` double(6,2) unsigned NOT NULL DEFAULT '0.00',
`price3` decimal(6,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`deptno`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
+-------+-------------------------------------------------------------+
1 row in set (0.00 sec)

 

最后

以上就是爱笑小鸽子为你收集整理的MySQL 数据类型、字符集编码、存储引擎MySQL 数据类型 - 字符串MySQL 数据类型 - 整数值MySQL 数据类型 - 浮点数、定点型MySQL 数据类型 - 日期与时间MySQL 字符集编码Mysql 存储引擎概述查看 Mysql 数据库存储引擎修改 MySQL 数据库存储引擎查看 Mysql 数据表存储引擎修改 Mysql 数据表存储引擎的全部内容,希望文章能够帮你解决MySQL 数据类型、字符集编码、存储引擎MySQL 数据类型 - 字符串MySQL 数据类型 - 整数值MySQL 数据类型 - 浮点数、定点型MySQL 数据类型 - 日期与时间MySQL 字符集编码Mysql 存储引擎概述查看 Mysql 数据库存储引擎修改 MySQL 数据库存储引擎查看 Mysql 数据表存储引擎修改 Mysql 数据表存储引擎所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部