字符类型
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
存储引擎中,不存在这种差异。
#官网: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 |
由于 即存入 |
差异对比
如果要想进定长与变长的差异对比试验,需要用到以下两个函数。
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>