服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL数据类型之浅谈字符串(string)

MySQL数据类型之浅谈字符串(string)

2022-11-23 14:30leboop-L Mysql

这篇文章主要介绍了MySQL数据类型之字符串(string)的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

字符类型(CHAR Types)

CREATE TABLE t1 (c1 CHAR(10));

该语句创建了一张t1表,表中只有一个字段c1,类型为char,char(10)括号中的10表示字段c1最多能够存储10个字符。

char最多可以存储255个字符,最小可以存储0个字符。

可以如下向表中插入数据:

INSERT INTO t1 (c1) VALUES("");
INSERT INTO t1 (c1) VALUES("xy");
INSERT INTO t1 (c1) VALUES("0123456789");

该语句向c1字符中分别插入了长度为0,2和10的三个字符,可以如下查询数据:

select * from t1

结果如图:

MySQL数据类型之浅谈字符串(string)

虽然插入了两条不足10个字符的数据,但是MySQL在存储char类型数据时,仍然占用10个字符个空间,它在不足10个字符的右边添加空白字符补足10个字符长度,所以char类型存储时的长度是固定的。

可以如下查询字符长度:

SELECT c1, CHAR_LENGTH(c1) FROM t1;

结果如图:

MySQL数据类型之浅谈字符串(string)

有人肯定要问,刚刚不是说每个值都应该是10个字符长度吗?没错。但是MySQL在查询char类型数据时,默认做了一个处理,它将值后面的所有空格全部移除,然后再将结果返回给我们。

也就是上面的这个结果。可以如下来取消这个处理

SET sql_mode = "PAD_CHAR_TO_FULL_LENGTH";

再次执行上面的这个查询,结果是:

MySQL数据类型之浅谈字符串(string)

图中竖线是鼠标光标位置,光标前面就是10个空白字符。

可变字符类型(Varchar Types)

varchar类型和char类型非常相似。如下创建一张表t2

CREATE TABLE t2 (c1 VARCHAR(10));

该表c1字段是varchar类型,10也是表示c1字符能够存储的最大字符长度。如下向表中插入三条数据

INSERT INTO t2 (c1) VALUES("");
INSERT INTO t2 (c1) VALUES("xy");
INSERT INTO t2 (c1) VALUES("0123456789");

不同的是MySQL在存储VARCHAR类型时,存储实际长度,也就是说存储c1字段的值时分别占用0、2和10个字符空间(实际要大1-2个字节用于存储字符长度),这点和char类型是不同的。

可以执行如下语句来验证

SET sql_mode = "PAD_CHAR_TO_FULL_LENGTH";
SELECT c1, CHAR_LENGTH(c1) FROM t2;

设置sql_mode之前和之后,c1的长度不变,如图:

MySQL数据类型之浅谈字符串(string)

varchar类型能够存储最多65535个字符,但是需要注意,不是每个表的字段都能申请到这个长度,因为MySQL对单行的大小限制为65535个字节,也就是表的一行的所有字段大小的和不能超过65535个字节。如果其他字段已经申请了比较大的空间,那么c1字段可能就不能申请65535个字符空间了。

(1)存储超过定义时指定长度的字符

这个由sql_mode决定,在strict mode下,插入失败并报错,在非strict mode会插入成功,超过部分会被截取掉,如图:

strict mode:

MySQL数据类型之浅谈字符串(string)

重新设置sql_mode变量,再插入:

MySQL数据类型之浅谈字符串(string)

二进制类型(BINARY Types)

binary类型和char类型很相似,binary类型存储的是字节串而不是字符串,存储的最大字节串长度也是255,binary类型存储不足长度的值时也是在值的右边进行补全,不过用于补全的值是0x00(字符表示为''),但查询时会保留尾部补全的值。

例如对于BINARY(3),插入'a '时,存储的是'a ',插入'a'时,存储的是'a',查询时分别是'a '和'a'。

可以如下验证

CREATE TABLE t3 (c BINARY(3));
INSERT INTO t3 VALUES("a");
SELECT c,CHAR_LENGTH(c),HEX(c),c = "a", c = "a" from t3;

结果如图:

MySQL数据类型之浅谈字符串(string)

说明查询到的是'a',不过显示的是a。

可变二进制类型(VARBINARY Types)

varbinary和varchar类似,存储的是字节串,存储的最大字节长度为65535,存储实际定义的字节长度,不会在尾部用''补全,查询时当然也就没有移除尾部补全的值。

二进制大对象类型(BLOB Types)

blob类型可以看成是varbinary类型,可以存储超大二进制数据。

根据存储长度不同又分为四种: TINYBLOB, BLOB, MEDIUMBLOB, 和 LONGBLOB。

文本类型(Text Types)

text可以看成是varchar,可以存储超大的字符串数据。

根据存储长度不同又分为四种:TINYTEXT, TEXT,MEDIUMTEXT和 LONGTEXT.

枚举类型(ENUM Type)

枚举类型主要用于某个列的取值只有有限的几个,比如表示星期几的列,只会是星期一,星期二,...,星期日这个值。

可以如下创建枚举类型:

CREATE TABLE shirts (
    name VARCHAR(40),
    size ENUM("x-small", "small", "medium", "large", "x-large")
);

 如下插入一些数据

INSERT INTO shirts (name, size) VALUES 
("dress shirt","large"),
("t-shirt","medium"),
("polo shirt","ss");

结果如下:

MySQL数据类型之浅谈字符串(string)

当插入的值不在枚举类型中,size中会是空白。可以通过索引进行查询:

select * from shirts where size=4

等价于

select * from shirts where size="larger"

'x-small', 'small', 'medium', 'large', 'x-large'的索引分别是1,2,3,4,NULL的索引是NULL,空字符串''的索引是0。

枚举类型中可以有65535个不同的取值。

集合类型(SET Type)

有时候,一个列的取值只可能是有限个值的不重复组合,如下创建集合类型

CREATE TABLE myset (col SET("a", "b", "c", "d"));

插入数据: 

INSERT INTO myset (col) VALUES 
("a,d"),
("d,a"), 
("a,d,a"), 
("a,d,d"), 
("d,a,d");

结果如图:

MySQL数据类型之浅谈字符串(string)

从结果来看,集合类型中的集合就是数学中的集合,满足无序和不重复。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文地址:https://blog.csdn.net/L_15156024189/article/details/87433372

延伸 · 阅读

精彩推荐
  • MysqlMySQL学习笔记之创建、删除、修改表的方法

    MySQL学习笔记之创建、删除、修改表的方法

    这篇文章主要介绍了MySQL学习笔记之创建、删除、修改表的方法,结合实例分析了mysql创建表、增加,修改及删除列、查看表结构、删除表等基本语法与使用技...

    hbiao681642020-06-23
  • Mysqlmysql 显示SQL语句执行时间的代码

    mysql 显示SQL语句执行时间的代码

    查看 MySQL 語法 詳細執行時間 與 CPU/記憶體使用量: MySQL Query Profiler ...

    mysql教程网2882019-10-31
  • MysqlMySQL ALTER语法的运用方法

    MySQL ALTER语法的运用方法

    我们今天主要向大家介绍的是MySQL ALTER语法的实际运用,如果你对这一技术,心存好奇的话,以下的文章将会揭开它的神秘面纱。 ...

    mysql教程网4172019-11-11
  • Mysql详解mysql中的concat相关函数

    详解mysql中的concat相关函数

    这篇文章主要介绍了mysql中的concat相关函数,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    码农Robin5042019-06-15
  • MysqlMySQL InnoDB 事务锁源码分析

    MySQL InnoDB 事务锁源码分析

    InnoDB 事务锁,事务锁实现起来的代码却是又臭又硬的好大一坨,各种细节,今天小编在这里整理一个源码阅读笔记,把那一坨加锁相关的代码提炼出来,感...

    github8482021-11-17
  • Mysqlmysql 8.0.12 安装配置方法图文教程

    mysql 8.0.12 安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.12 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    missing20112602020-09-03
  • Mysqlmysql 初始执行文件的使用介绍

    mysql 初始执行文件的使用介绍

    本文将详细介绍mysql 初始执行文件的使用方法,现在晒出来和大家分享下,希望可以帮助你们 ...

    MYSQL教程网2672019-12-13
  • Mysqlmysql 计算函数详情

    mysql 计算函数详情

    这篇文章主要介绍了mysql 计算函数,函数没有SQL的可移植性强 能运行在多个系统上的代码称为可移植的(portable)。相对来说,多数SQL语句是可移植的,在...

    敖毛7762021-11-30