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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
7月前
|
关系型数据库 MySQL Linux
CentOS 7系统下详细安装MySQL 5.7的步骤:包括密码配置、字符集配置、远程连接配置
以上就是在CentOS 7系统下安装MySQL 5.7的详细步骤。希望这个指南能帮助你顺利完成安装。
1766 26
|
10月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
2557 82
|
8月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
|
存储 关系型数据库 MySQL
MySQL数据库的数据类型、语法和高级查询
MySQL数据库的数据类型、语法和高级查询
183 0
|
关系型数据库 MySQL 数据库
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
161 5
|
存储 关系型数据库 MySQL
MySQL支持多种数据类型
MySQL支持多种数据类型
298 4
|
存储 关系型数据库 MySQL
MySQL数据类型
MySQL数据类型
144 3
|
存储 关系型数据库 MySQL
什么是mysql的数据类型?
什么是mysql的数据类型?
168 2
|
存储 关系型数据库 MySQL
|
关系型数据库 MySQL Linux
数据类型和运算符(MySQL服务器的安装,MySQL客户端,数据类型,运算符,MySQL的语法规范)
无论是对于初学者还是有经验的开发者,了解MySQL的安装、客户端使用、数据类型、运算符和语法规范都是至关重要的。这不仅有助于高效地管理和查询数据,而且对于设计和实现数据库解决方案来说是基础工作。通过深入学习和实践这些知识,您可以更好地发挥MySQL数据库的强大功能。
116 2