mysql 定义字符用什么_MySQL 字符类型

本文详细介绍了MySQL中CHAR和VARCHAR两种常见字符类型的使用,包括它们的大小、用途及存储差异。CHAR是定长字符串,适合存储固定长度的数据,而VARCHAR则是变长字符串,更节省空间但存取速度较慢。在存储效率和空间占用方面,两者各有优势。此外,文章还提到了字符集和校对规则的概念,并提供了相关函数的使用示例,帮助理解字符类型在实际操作中的应用。
摘要由CSDN通过智能技术生成

字符类型

MySQL提供了多种关于字符存储的类型,但是在大多数情况下我们只使用char和varchar即可

类型大小用途

CHAR

0 - 255字节

定长字符串

VARCHAR

0 - 65535 字节

变长字符串

TINYBLOB

0 - 255字节

不超过 255 个字符的二进制字符串

TINYTEXT

0 - 255字节

短文本字符串

BLOB

0 - 65 535字节

二进制形式的长文本数据

TEXT

0 - 65 535字节

长文本数据

MEDIUMBLOB

0 - 16 777 215字节

二进制形式的中等长度文本数据

MEDIUMTEXT

0 - 16 777 215字节

中等长度文本数据

LONGBLOB

0 - 4 294 967 295字节

二进制形式的极大文本数据

LONGTEXT

0 - 4 294 967 295字节

极大文本数据

字符集

字符串分二进制与非二进制类型,二进制用于储存图片、声音等文件,非二进制用于储存文本数据。

非二进制文本受字符集和校对规则影响。

其实字符集说白了就是字符编码。

概念解析

字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。常用的字符集有GBK、BIG5、UTF8。

UTF8字符集包含文字内容更广,如韩文、日文、德文兼容度更高,也是推荐使用的字符集(UTF8MB4)。

表不设置字符集继承数据库,字段不设置字符集继承表的,所以一般我们在配置文件中为数据库指定字符集即可

SHOW CHARACTER SET; -- 查看服务器支持的字符集

校对规则

字符集内用于字符比较和排序的一套规则,以_ci结束的为大小写不敏感、_bin结束的为不区分大小写。

当使用不区分大小写的校对规则时A与a是相同的,否则则不相同,这会影响到排序与比对。

修改表校对规则,对表的原字段将不影响,只对新增字段影响

SHOW COLLATION; -- 查看服务器支持的校对规则

基本定义

对于字符类型而言,其指定宽度均为存入宽度,以字符为单位。

create table temp(

ch char(5) not null, # 最多5个字符

vc varcha(5) not null # 最多5个字符

);

定长变长

区别差异

char是定长字符串,当存入的字符数量不足指定宽度时,将会使用进行填充。

varchar是变长字符串,当存入的字符数类不足指定宽度时,不会使用任何字符进行填充。

通常情况下来讲,char的存取速度要比varchar要高(约50%),但是更加浪费磁盘空间。

在InnoDB存储引擎中,不存在这种差异。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#官网:https://dev.mysql.com/doc/refman/5.7/en/char.html

#注意:char和varchar括号内的参数指的都是字符的长度

#char类型:定长,简单粗暴,浪费空间,存取速度快

字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)

存储:

存储char类型的值时,会往右填充空格来满足长度

例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储

检索:

在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode= 'PAD_CHAR_TO_FULL_LENGTH';)

#varchar类型:变长,精准,节省空间,存取速度慢

字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)

存储:

varchar类型存储数据的真实内容,不会用空格填充,如果'ab',尾部的空格也会被存起来

强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)

如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)

如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)

检索:

尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容

差异详解

插入值CHAR(4)存入值CHAR(4)占据空间VARCHAR(4)存入值VARCHAR(4)占据空间

''

' '

4 bytes

''

1 byte

'ab'

'ab '

4 bytes

'ab'

3 bytes

'abcd'

'abcd'

4 bytes

'abcd'

5 bytes

'abcdefgh'

'abcd'

4 bytes

'abcd'

5 bytes

由于varchar类型是变长存储,所以需要有一个头部来标识真实内容占了多少字符,这个头部通常占据1个字节。

即存入abcd的时候算上头部实际上是占用了5个字节。这也是为什么说通常情况下varchar比较节省内存,而不是说全部情况。

差异对比

如果要想进定长与变长的差异对比试验,需要用到以下两个函数。

length():查看字节数

char_length():查看字符数

mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; # 必须修改模式,使其查看定长字符类型时不会将填充空格移除。

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create table ch( # 创建定长字符类型的数据表,最大字符数为5字符

-> name char(5) not null

-> );

Query OK, 0 rows affected (0.05 sec)

mysql> create table vc( # 创建变长字符类型的数据表,最大字符数为5字符

-> name varchar(5) not null

-> );

Query OK, 0 rows affected (0.03 sec)

mysql> insert into ch(name) values("ab"); # 插入2字符的数据

Query OK, 1 row affected (0.01 sec)

mysql> select char_length(name) from ch; # 可以看到这里的字符数为5,默认填充了3个空白字符

+-------------------+

| char_length(name) |

+-------------------+

| 5 |

+-------------------+

1 row in set (0.00 sec)

mysql> insert into vc(name) values("ab"); # 插入2字符的数据

Query OK, 1 row affected (0.00 sec)

mysql> select char_length(name) from vc; # 字符数量依旧为2字符

+-------------------+

| char_length(name) |

+-------------------+

| 2 |

+-------------------+

1 row in set (0.00 sec)

mysql>

小总结:建议在同一张数据表中统一使用varchar或char类型,这里更推荐使用char类型。

常用函数

大小写转换

upper()小写转大写,lower()大写转小写

mysql> select upper("mysql"),lower("MYSQL");

+----------------+----------------+

| upper("mysql") | lower("MYSQL") |

+----------------+----------------+

| MYSQL | mysql |

+----------------+----------------+

1 row in set (0.00 sec)

mysql>

指定量取

left()与right()函数用于取左或右指定数量的字符

以下将示例取左边3个字符。

mysql> select left("一二三四五",3);

+----------------------+

| left("一二三四五",3) |

+----------------------+

| 一二三 |

+----------------------+

1 row in set (0.00 sec)

mysql>

中间字符

mid()从中间取字符串,参数二为指定起始位置(从1开始),参数三为取的字符数量(可不指定,一直取完)。

以下将演示从第二个字符开始取两个。

mysql> select mid("一二三四五",2,2);

+-----------------------+

| mid("一二三四五",2,2) |

+-----------------------+

| 二三 |

+-----------------------+

1 row in set (0.00 sec)

mysql>

截取子串

substring()从指定起始位置开始取出向右所有字符串,可指定结束位置。(其实我感觉这个和mid()好像没啥区别)

mysql> select substring("一二三四五六七八九",1,4);

+-------------------------------------+

| substring("一二三四五六七八九",1,4) |

+-------------------------------------+

| 一二三四 |

+-------------------------------------+

1 row in set (0.00 sec)

mysql>

字符长度

char_length()可获取字符长度,如果要获取char类型的字符长度且包括填充空白符,需要修改sql模式。

修改sql模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';

mysql> select char_length("一二三四五六七八九");

+-----------------------------------+

| char_length("一二三四五六七八九") |

+-----------------------------------+

| 9 |

+-----------------------------------+

1 row in set (0.00 sec)

mysql>

字节长度

length()可获取字节长度。

mysql> select length("一二三四五六七八九");

+------------------------------+

| length("一二三四五六七八九") |

+------------------------------+

| 18 |

+------------------------------+

1 row in set (0.00 sec)

mysql>

字符连接

concat()可将多段字符进行连接。

以下示例将展示一二三四五,---以及12345这三段字符的连接。

mysql> select concat("一二三四五","---","12345");

+------------------------------------+

| concat("一二三四五","---","12345") |

+------------------------------------+

| 一二三四五---12345 |

+------------------------------------+

1 row in set (0.00 sec)

mysql>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值