【MySQL】——数据类型及字符集

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL】——数据类型及字符集

🎯概述:

MySQL数据类型(列类型)可归纳为数值型、时间日期型和字符型。


数值型:


整形:tinyint/smallint/mediumint/int/bigint


小数型:Float(D,M),decimal(D,M)


字符串型:


Char(M)


Varchar(M)


Text 文本类型


日期/ 时间型:


Date 日期


Time 时间


Datetime 日期时间型


TIMESTAMP    时间戳类型


Year 年类型


🎯数值型

🎃整数型

tinyint(1), smallint(2), mediumint(3),int(4), bigint(8)。括号中表示该类型所占空间的长度(字节数)

类型

大小

范围(有符号)

范围(无符号)

用途

TINYINT

字节

(-128127)

(0,255)

小整数值

SMALLINT

字节

(-32 76832 767)

(0,65 535)

大整数值

MEDIUMINT

字节

(-8388 6088388 607)

(0,16777215)

大整数值

INTINTEGER

字节

(-2147483648,2147483647)

(0,4294967295)

大整数值

BIGINT

8字节

(-9,223,372,036,854,775,808,9223372036854775807)

(0,18446744073709551615)

极大整数值


整形系统的可选参数: XXint(M) unsigned zerofill

例: age tinyint(4) unsigned 或者 stunum smallint(6) zerofill

Unsigned: 代表此列为无符号类型,会影响到列的存储范围(范围从0 开始)

(不加unsigned, 则代表该列默认是有符号类型,范围从负数开始)

列可以声明默认值,而且推荐声明默认值

Not null default 0;


Zerofill :代表0 填充,即:如果该数字不足参数M位,则自动补0,补够M位。


1. 如果没有zerofill 属性,单独的参数M,没有任何意义


2. 如果设置某列为zerofill, 则该列已经默认为unsigned, 无符号类型,M代表该列的显示宽度。


🎃小数类型

🎐 浮点数

小数型: float(M,D),decimal(M,D)

float(M,D): 浮点小数,代表可存储一共M位(不含小数点),其中,小数点后D位

decimal(M,D) :定点小树, M,D的意义同上.


区别: decimal 比float 精度更高,适合存储货币等要求精确的数字.

见下例:


🎯日期时间型

mysql 时间类型有,date,time,datetime,timestamp,year五种。


date类型: 支持的范围为’1000-01-01’到’9999-12-31’


time类型: 支持的范围是’-838:59:59’到’838:59:59’


datetime类型:支持的范围是’1000-01-01 00:00:00’到’9999-12-31 23:59:59’


timestamp类型:时间戳,就是表示“当前时刻”, 用int 来存储,是1970-01-01 00:00:00 到当前的秒数,类似函数now()获得的值,用于INSERT或UPDATE操作时自动获得当前时间。


一般存注册时间,商品发布时间等,并不是用datetime 存储,而是用时间戳。因此datetime 虽然直观,但计算不便。


year类型: 四位字符串,范围为’1901’到’2155’;四位数字,范围为1901到2155;两位字符串,范围为’00’到’99’;两位整数,范围为1到99


在mysql中除了timestamp 类型允许有默认值外,其他时间类型都不能有默认值,不然会报错。


mysql常用时间日期函数


获取当前日期和时间: now();


获取当前日期: curdate();


获取当前时间:curtime();


将具体时间转换为时间戳:unix_timestamp();


将时间戳转换为时间:from_unixtime();


🎯字符串类型

mysql提供的有CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。


Char 定长类型

Char(M),M 代表宽度,( 即:可容纳的字符数),0<=255 之间

例: char(10), 则能输入10 个字符.


Varchar 变长类型


varchar(M),M 代表宽度,( 即:可容纳的字符数),0<=M<=65535(以ascii 字符为例, utf8 22000左右)


定长二进制字符串binary:类似char,应该设定长度值,只是按“二进制字节”保存存字符数据,最大255个字节,无编码问题


变长二进制字符串varbinary:类似varchar,需要设定长度值,只是按“二进制字节”存字符数据,最大65532个字节,无编码问题


文本列类型text:用于存储普通文本,不受行的最大长度的限制,同类还有:tinytext, mediuntext, longtext


二进制列类型blob:用于存储二进制字节内容,不受行的最大长度的限制,同类的还有:tinyblob, mediumblob, longblob


枚举类型enum: 类似单选项应用中的多个选项值,最大65535个选项值;使用形式:enum(‘value1’, ‘value2’, … );存储数据的时候其实存的是一个对应的数字序号(从1开始)


set类型:类似多选项应用中的多个选项,最多64个选项,使用形式:set(‘value1’, ‘value2’, …); 内部存储的也是数字(依次为1,2,4,8, ….),但可以是多个值,比如5就表示2个值(1,4),14就表示3个值(2,4,8)


Char(M) 如何占据M个字符宽度?

答:如果实际存储内容不足M个,则后面加空格补齐

取出来的时候,再把后表面的空格去掉. (所以如果内容最后有空格,将会被清除)速度上:定长速度快些。

Char 与varchar 相关实验


Concat 连接的意思


SET 和 enum


create table seTest(


id int auto_increment,


hobby set('篮球','足球','羽毛球','乒乓球','棒球'),


gender enum('male','female','not know'),


primary key(id)


)engine = myisam default charset = utf8;


insert into seTest(hobby,gender) values('篮球','male'),('篮球,足球,棒球','not know');


insert into seTest(hobby,gender) values('篮球','male,female');


insert into seTest(hobby,gender) values('篮球','male female');


insert into seTest(hobby,gender) values('排球','male female');


mysql> show warnings;


mysql> select * from setest;

可以看到,当插入的值跟set 、enum 字段值要求不符时,会插入空值。

常用字符串函数

concat(column|str1,column | str2,….)将多个字符串首尾相连后返回。


concat_ws(separator,str1,str2,….)将多个字符串指定连接符separator的首尾相连后返回


substr(str,pos[,len]) 从字符串中的指定位置pos开始取一个字串返回


repeat(str,count) 将字符串str重复count次后返回


reverse(str) 将字符串str反转后返回


🎯mysql字符集问题

Mysql 的字符集设置非常灵活

可以设置服务器默认字符集

数据库默认字符集

表默认字符集

列字符集

(如果某一个级别没有指定字符集,则继承上一级)


set names gbk


set names utf8


执行show variables like 'character%',获取字符集配置为:


由于CMD命令行只支持系统当前编码,所以一般需要将CMD与MYSQL服务器的交互编码设置为gbk才能正常显示utf8的数据。


character_set_client、character_set_connection和character_set_results变成了utf8,可以看出set names就是设置这三个参数的值。一个select执行的过程应该是:client——>connection——>server/database——>results——>connection——>client,任何一个环节的字符集不兼容都会出现乱码。


1、用户通过mysql.exe来操作mysqld.exe


2、真正的SQL执行是mysqld.exe来执行


3、mysql.exe将数据传入mysqld.exe的时候,没有告知其对应的符号规则(字符集),而mysqld也没有能力自己判断,就会使用自己默认的(字符集);


解决方案:


mysql.exe如果告知mysqld.exe对应的字符集类型为GBK


深层原理:


客户端、服务器、连接层


客户端传入数据给服务器:client


服务器返回数据给客户端:server


客户端与服务器端之间的连接:connection


780f28d153cbae06cc3e1787e5817079_3607ad0774f94547ad8a6023591c0149.png

780f28d153cbae06cc3e1787e5817079_3607ad0774f94547ad8a6023591c0149.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
关系型数据库 MySQL 数据库
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
44 5
|
6月前
|
存储 关系型数据库 MySQL
MySQL数据库的数据类型、语法和高级查询
MySQL数据库的数据类型、语法和高级查询
89 0
|
2月前
|
存储 关系型数据库 MySQL
MySQL支持多种数据类型
MySQL支持多种数据类型
138 3
|
2月前
|
存储 关系型数据库 MySQL
什么是mysql的数据类型?
什么是mysql的数据类型?
53 2
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据类型
MySQL数据类型
61 2
|
4月前
|
关系型数据库 MySQL Linux
数据类型和运算符(MySQL服务器的安装,MySQL客户端,数据类型,运算符,MySQL的语法规范)
无论是对于初学者还是有经验的开发者,了解MySQL的安装、客户端使用、数据类型、运算符和语法规范都是至关重要的。这不仅有助于高效地管理和查询数据,而且对于设计和实现数据库解决方案来说是基础工作。通过深入学习和实践这些知识,您可以更好地发挥MySQL数据库的强大功能。
37 2
|
4月前
|
存储 关系型数据库 MySQL
MySQL 中的 BLOB 数据类型深入解析
【8月更文挑战第31天】
588 0
|
4月前
|
存储 关系型数据库 MySQL
|
4月前
|
存储 XML 关系型数据库
深入理解MySQL中的BLOB和TEXT数据类型
【8月更文挑战第31天】
737 0
|
4月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
529 0