首页 » SEO优化 » phpchar和varchar技巧_CHAR与VARCHAR详解

phpchar和varchar技巧_CHAR与VARCHAR详解

访客 2024-11-18 0

扫一扫用手机浏览

文章目录 [+]

序言:

前面写过一篇先容int类型的文章,一贯想写一篇先容字符串字段类型的文章,一贯拖着也没思路要怎么下手。
最近多关注了下这方面的文章,决定还是把拖了好久的文章了却了吧。
本篇文章紧张会先容字符串类型char及varchar的用法及差异。

phpchar和varchar技巧_CHAR与VARCHAR详解

本文实验环境为MySQL 5.7.23版本,存储引擎为Innodb,sql_mode采取严格模式,字符集是utf8。

phpchar和varchar技巧_CHAR与VARCHAR详解
(图片来自网络侵删)

▍1.CHAR类型先容

我们平时利用char类型定义字段时,每每会指定其长度M,即char(M)。
实在M指的是字符数,即这个字段最多存储多少个字符,M可不指定,默认为1,范围是[0,255],单个字母、数字、中文等都是占用一个字符。
utf8字符集下一个中笔墨符占用3个字节。
下面我们大略测试下:

# 假设以如下建表语句创建测试表CREATE TABLE `char_tb1` ( `col1` char DEFAULT NULL, `col2` char(5) DEFAULT NULL, `col3` char(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;# 进入数据库查询建表语句如下 创造char(M) M可不指定,默认为1mysql> show create table char_tb1\G 1. row Table: char_tb1Create Table: CREATE TABLE `char_tb1` ( `col1` char(1) DEFAULT NULL, `col2` char(5) DEFAULT NULL, `col3` char(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)# 插入数据 可以看出M表示保存的最大字符数,字母、数字、中文等都是占用一个字符mysql> insert into char_tb1 (col1) values ('a'),('1'),('王'),(']');Query OK, 4 rows affected (0.01 sec)mysql> insert into char_tb1 (col1) values ('aa'),('12');ERROR 1406 (22001): Data too long for column 'col1' at row 1mysql> select from char_tb1;+------+------+------+| col1 | col2 | col3 |+------+------+------+| a | NULL | NULL || 1 | NULL | NULL || 王 | NULL | NULL || ] | NULL | NULL |+------+------+------+4 rows in set (0.00 sec)mysql> insert into char_tb1 (col2) values ('abcd'),('王-123'),('^123'),('12'),('一二三四五');Query OK, 5 rows affected (0.01 sec)mysql> insert into char_tb1 (col2) values ('abcdef');ERROR 1406 (22001): Data too long for column 'col2' at row 1mysql> select from char_tb1;+------+-----------------+------+| col1 | col2 | col3 |+------+-----------------+------+| a | NULL | NULL || 1 | NULL | NULL || 王 | NULL | NULL || ] | NULL | NULL || NULL | abcd | NULL || NULL | 王-123 | NULL || NULL | ^123 | NULL || NULL | 12 | NULL || NULL | 一二三四五 | NULL |+------+-----------------+------+9 rows in set (0.00 sec)# 下面测试创造M的范围是[0,255] mysql> alter table char_tb1 add column col4 char(0);Query OK, 0 rows affected (0.10 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> alter table char_tb1 add column col5 char(255);Query OK, 0 rows affected (0.11 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> alter table char_tb1 add column col5 char(256);ERROR 1074 (42000): Column length too big for column 'col5' (max = 255); use BLOB or TEXT instead

▍2.VARCHAR类型先容

同样的,varchar(M)中的的M表示保存的最大字符数,单个字母、数字、中文等都是占用一个字符。
varchar可存储的长度范围为0-65535字节,此外,varchar须要利用1或者2个额外字节记录字符串的长度:如果列的最大长度小于或即是255字节,则只利用1个字节表示,否则利用2个字节。
对付Innodb引擎,utf8字符集来说,单个中笔墨符占用3个字节,以是varchar(M)中的M最大不会超过21845,即M的范围是[0,21845),并且M必须指定。
其余MySQL规定:单个字段长度不大于65535字节;单行最大限定为65535,这里不包括TEXT、BLOB字段。
即单张表中的所有varchar字段定义的长度之和不能大于65535,以是并不是所有varchar(M)字段中的M都可以取到21844,下面我们来验证下:

# 假设以如下建表语句创建测试表CREATE TABLE `varchar_tb1` ( `col1` varchar(0) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;# 查看建表语句 增加字段 创造M必须指定mysql> show create table varchar_tb1\G 1. row Table: varchar_tb1Create Table: CREATE TABLE `varchar_tb1` ( `col1` varchar(0) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)mysql> alter table varchar_tb1 add column col2 varchar;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1# 下面测试证明M最大可取到21844mysql> CREATE TABLE `varchar_tb2` (col1 varchar(21844));Query OK, 0 rows affected (0.04 sec)mysql> CREATE TABLE `varchar_tb3` (col1 varchar(218445));ERROR 1074 (42000): Column length too big for column 'col1' (max = 21845); use BLOB or TEXT instead# 下面测试证明单行最大限定为65535字节mysql> CREATE TABLE `varchar_tb3` (col1 varchar(10));Query OK, 0 rows affected (0.04 sec)mysql> alter table varchar_tb3 add column col2 varchar(21844);ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsmysql> alter table varchar_tb3 add column col2 varchar(21834);ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsmysql> alter table varchar_tb3 add column col2 varchar(21833);Query OK, 0 rows affected (0.09 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> show create table varchar_tb3\G 1. row Table: varchar_tb3Create Table: CREATE TABLE `varchar_tb3` ( `col1` varchar(10) DEFAULT NULL, `col2` varchar(21833) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)

▍3.CHAR与VARCHAR比较

CHAR类型是定长的,MySQL总是根据定义的字符串长度分配足够的空间。
当保存CHAR值时,在它们的右边添补空格以达到指定的长度,当检索到CHAR值时,尾部的空格被删除掉。

VARCHAR类型用于存储可变长字符串,存储时,如果字符没有达到定义的位数,也不会在后面补空格。
但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致须要做额外的事情。
如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情形下InnoDB须要分裂页来使行可以放进页内,这样会增加碎片。

下面大略总结下CHAR与VARCHAR字段类型的适用场景:

CHAR适宜存储很短的字符串,或者所有值都靠近同一个长度。
例如,CHAR非常适宜存储密码的MD5值,由于这是一个定长的值。
对付常常变更的数据,CHAR也比VARCHAR更好,由于定长的CHAR类型不随意马虎产生碎片。
对付非常短的列,CHAR比VARCHAR在存储空间上也更有效率。
例如用CHAR(1)来存储只有Y和N的值,如果采取单字节字符集只须要一个字节,但是VARCHAR(1)却须要两个字节,由于还有一个记录长度的额外字节。

下面这些情形下利用VARCHAR是得当的:字符串很长或者所要存储的字符串长短不一,差别很大;字符串列的最大长度比均匀长度大得多;列的更新很少,以是碎片不是问题。

额外解释下,我们在定义字段最大长度时该当按需分配,提前做好预估。
特殊是对付VARCHAR字段,有人认为反正VARCHAR数据类型是根据实际的须要来分配长度的,还不如给大一点呢。
但事实不是这样的,比如现在须要存储一个地址信息,根据评估,只要利用100个字符就可以了,我们可以利用VARCHAR(100)或VARCHAR(200)来存储,虽然它们用来存储90个字符的数据,其存储空间相同,但是对付内存的花费是不同的。
更长的列会花费更多的内存,由于MySQL常日会分配固定大小的内存块来保存内部值,尤其是利用内存临时表进行排列或者操作时会特殊糟糕。
以是我们在分配VARCHAR数据类型时仍旧不能够太过于年夜方。
还是要评估实际须要的长度,然后选择一个最长的字段来设置字符长度。
如果为了考虑冗余,可以留10%旁边的字符长度。
千万不能认为VARCHAR是根据实际长度来分配存储空间,而随意的分配长度,或者说干脆利用最大的字符长度。

总结:

本文分别先容了CHAR与VARCHAR字段类型的利用方法,并且给出了二者的比拟以及适用场景。
在实际生产情形,须要详细情形详细剖析,得当的才是最好的,希望这篇文章能给到大家参考。

欢迎关注个人公众号『MySQL技能』

标签:

相关文章

au9999贵金属中的瑰宝

在我国,贵金属投资已成为越来越多投资者的理财选择。其中,“au9999”作为贵金属投资中的瑰宝,备受关注。本文将从“au9999”...

SEO优化 2025-04-14 阅读5 评论0

e色vs2钻石价格品质与价值的完美诠释

钻石,作为珠宝界的翘楚,自古以来就备受宠爱。而e色vs2钻石,作为钻石中的佼佼者,更是备受消费者青睐。本文将从e色vs2钻石的价格...

SEO优化 2025-04-14 阅读3 评论0

AI量化交易系统金融科技的未来之光

人工智能(AI)在金融领域的应用越来越广泛。其中,AI量化交易系统凭借其精准的数据分析、高效的操作速度和智能的风险控制,成为了金融...

SEO优化 2025-04-14 阅读5 评论0