字符串类型包括:char、varchar

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

 

Mysql内置函数:

char_length():查看字符数

length(): 查看字节数

 

1. char类型

特点:定长,简单粗暴,浪费空间,存取速度快

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

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

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

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

 

试验:

char类型不指定宽度,默认为1,插入超过1的字符数也只会存入1个字符

MariaDB [db3]> create table t5(name char(5));  # 创建一个t5表,设置name字段,类型为char,宽度为5
Query OK, 0 rows affected (0.01 sec)

MariaDB [db3]> desc t5;  # 查看t5表结构
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| name  | char(5) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

MariaDB [db3]> insert into t5 values("中国 ");  # 插入一条记录 中国2个字+1个空格
Query OK, 1 row affected (0.00 sec)

MariaDB [db3]> select * from t5; # 查看一下存入的记录,看不出来究竟存储了多少个字符,多少个字节
+--------+
| name   |
+--------+
| 中国   |
+--------+
1 row in set (0.00 sec)

MariaDB [db3]> select name, char_length(name) from t5;   # 通过char_length()函数查看存入为2个字符,实际上应该是5个字符(2个中文+1个空格+2个填充的空格),因为查询时mysql不要脸把空格删了
+--------+-------------------+
| name   | char_length(name) |
+--------+-------------------+
| 中国   |                 2 |
+--------+-------------------+
1 row in set (0.00 sec)

MariaDB [db3]> select name, length(name) from t5;  # 通过length()函数查看存入占用6个字节,实际上应该是9个字节(2个汉字占3个字节+1个空格占1个字节+2个填充的空格占2个字节)
+--------+--------------+
| name   | length(name) |
+--------+--------------+
| 中国   |            6 |
+--------+--------------+
1 row in set (0.00 sec)

MariaDB [db3]> set sql_mode="pad_char_to_full_length";  # 通过set sql_mode="pad_char_to_full_length" 修改SQL模式来看清真相
Query OK, 0 rows affected (0.00 sec)

MariaDB [db3]> select name, char_length(name) from t5;    # 再次通过char_length()函数查看到是5个字符,这才是真正的存入的字符数
+-----------+-------------------+
| name      | char_length(name) |
+-----------+-------------------+
| 中国      |                 5 |
+-----------+-------------------+
1 row in set (0.00 sec)

MariaDB [db3]> select name, length(name) from t5;   # 再次通过 length()函数查看到是占用9个字节,这才是真正的占用字节数     
+-----------+--------------+
| name      | length(name) |
+-----------+--------------+
| 中国      |            9 |
+-----------+--------------+
1 row in set (0.00 sec)

MariaDB [db3]> select * from t5 where name="中国";   # 加上条件查询一下(这里中国后面没有加存入时的空格),依然可以查询
+-----------+
| name      |
+-----------+
| 中国      |
+-----------+
1 row in set (0.00 sec)

MariaDB [db3]> select * from t5 where name="中国         ";   # 这里中国后加上很多个空格,超出存的范围了,依然可以查
+-----------+
| name      |
+-----------+
| 中国      |
+-----------+
1 row in set (0.00 sec)

MariaDB [db3]> select * from t5 where name="  中国    ";   # 在中国前面加空格就查不到了,因为存储时是右填充到指定字符宽度
Empty set (0.00 sec)

MariaDB [db3]> select * from t5 where name like "中国";    # 使用like查询时,只写中国,查不到   
Empty set (0.00 sec)

MariaDB [db3]> 
MariaDB [db3]> select * from t5 where name like "中国 ";   # 使用like查询时,写插入时的中国+1个空格,依然查不到
Empty set (0.00 sec)

MariaDB [db3]> select * from t5 where name like "中国   "; # 使用like查询时,中国后加上3个空格,便查询出来了,说明like是对值进行完整匹配
+-----------+
| name      |
+-----------+
| 中国      |
+-----------+
1 row in set (0.00 sec)

MariaDB [db3]> 

进行查询操作时,末尾空格会自动被去掉,但是在使用like查询时则不会去掉,必须写入完整条件。

 

 

2. 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)

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

 

试验:

MariaDB [db3]> create table t6(name varchar(5));  # 创建t6表,设置name字段,宽度为5
Query OK, 0 rows affected (0.00 sec)

MariaDB [db3]> desc t6;  # 查看t6表结构
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name  | varchar(5) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)

MariaDB [db3]> insert into t6 values("中国 ");  # 插入1条记录  中国+1个空格
Query OK, 1 row affected (0.00 sec)

MariaDB [db3]> select * from t6;
+---------+
| name    |
+---------+
| 中国    |
+---------+
1 row in set (0.00 sec)

MariaDB [db3]> select name, char_length(name) from t6;     # 查询到存入字符长度为3,正确(即2个汉字+1个空格)        
+---------+-------------------+
| name    | char_length(name) |
+---------+-------------------+
| 中国    |                 3 |
+---------+-------------------+
1 row in set (0.00 sec)

MariaDB [db3]> select name, length(name) from t6;   # 查询到占用字节数为7,正确(即2个汉字占用6个字节+1个空格占用1个字节)  
+---------+--------------+
| name    | length(name) |
+---------+--------------+
| 中国    |            7 |
+---------+--------------+
1 row in set (0.00 sec)

MariaDB [db3]> select * from t6 where name="中国";   # 条件不加空格可以查询
+---------+
| name    |
+---------+
| 中国    |
+---------+
1 row in set (0.00 sec)

MariaDB [db3]> select * from t6 where name="中国 ";  # 条件完整可以查询
+---------+
| name    |
+---------+
| 中国    |
+---------+
1 row in set (0.00 sec)

MariaDB [db3]> select * from t6 where name="中国     ";   # 条件加多个空格可以查询
+---------+
| name    |
+---------+
| 中国    |
+---------+
1 row in set (0.00 sec)

MariaDB [db3]> select * from t6 where name like "中国";    # like查询时,不加空格查不到  
Empty set (0.00 sec)

MariaDB [db3]> select * from t6 where name like "中国 ";   # like查询时,条件完整 可以查询到
+---------+
| name    |
+---------+
| 中国    |
+---------+
1 row in set (0.00 sec)

MariaDB [db3]> select * from t6 where name like "中国   ";   # like查询时,空格超出也查不到
Empty set (0.00 sec)

 

 

3. 关于char和varchar存储时所占空间对比如下:

我们通过上面的试验可以看到,varchar类型虽然通过length()函数看到字符所占用字节为7,但是在存储时还有1-2个字节在7个字节的前面作为头部信息,描述字符的字节大小。

 

 

4. 总结:

1) 常用字符串系列:char与varchar
注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡

2) 其他字符串系列(效率:char>varchar>text)
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB
BINARY系列 BINARY VARBINARY

3) text:text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。
mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.

 

 

 

 

发表评论

电子邮件地址不会被公开。

+ 33 = 38