概述
目录
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标识无符号) | 有符号范围(默认为有符号) |
tinyint | 1 | 0-255 | -128-127 |
smallint | 2 | 0-65535 | -32768~32767 |
mediumint | 3 | 0~16777215 | -8388608~8388607 |
int | 4 | 0~4294967295 | -2147483648~2147483647 |
bigint | 8 | 0~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)支持 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 数据表存储引擎所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复