关于mysql中的int(N)、char(N)和varchar(N)类型的简单说明

本文深入解析MySQL中的int、char及varchar数据类型的特性与区别,包括字段显示宽度的作用、zerofill属性的影响,以及不同场景下的存储行为。

在使用mysql时,int、char和varcahr这几种类型是比较常用的。在大学时有学过数据库,对于int(N)、char(N)和varchar(N)中的N一直了解的不是较透彻,前段时间在网上查了很多资料,现在整理下。

1、int(N)

int(N) ,N 表示最大显示宽度(字段设置zerofill属性时可查看区别),不指定N时,默认为11。N 的值跟 int(N) 所占多少存储空间或最大能存储多大长度数据并无任何关系。也就是说 int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。
1)创建测试表tb1,字段id1显示宽度为3,id2的显示宽度为5
mysql> create table tb1 (id1 int(3),id2 int(5));
Query OK, 0 rows affected (0.08 sec)
2)向测试tb1中插入数据。向其中插入数据12345,其数据字符宽度大于id2设置的显示宽度4。
mysql> insert into tb1 values (12,12345);
Query OK, 1 row affected (0.03 sec)
在执行数据插入操作后,无任何错误或警告提示。
3)查看插入的数据。
mysql> select * from tb1;
+------+-------+
| id1  | id2   |
+------+-------+
|   12 | 12345 |
+------+-------+
1 row in set (0.00 sec)
由上可知,实际插入的数据宽度大于显示宽度时,数据可正常插入表格中,数据未被截断。

那int(3)和int(5)到底有什么区别呢?
4)建一个新表tb2,与表tb1的区别是,id1和id2字段都设置了zerofill参数。
<span style="color:#333333;"></span>mysql>  create table tb2 (id1 int(3) <span style="color:#ff0000;">zerofill</span>,id2 int(5) <span style="color:#ff0000;">zerofill</span>);
Query OK, 0 rows affected (0.08 sec)<span style="color:#333333;">
</span>

5)向tb2中插入与tb1中同样的数据。
mysql> insert into tb2 values(12,12345);
Query OK, 1 row affected (0.05 sec)

6)查看表tb2的内容。
<span style="color:#333333;">mysql> select * from tb2;
+------+-------+
| id1  | id2   |
+------+-------+
|  </span><span style="color:#ff0000;">0</span><span style="color:#333333;">12 | 12345 |
+------+-------+
1 row in set (0.00 sec)
</span>
相比于tb1,在插入id1字段的数字12前多了个0。
再插入一个数据测试下;
mysql> insert into tb2 values(123,123);
Query OK, 1 row affected (0.04 sec)

mysql> select * from tb2;
+------+-------+
| id1  | id2   |
+------+-------+
|  012 | 12345 |
|  123 | 00123 |
+------+-------+
2 rows in set (0.00 sec)
此时在id插入的数据前多了两个0。
所以给字段加了zerofill参数后,如果实际插入的数据宽度小于字段设置的显示宽度N时,将自动在数字前填充0。同时,如果插入的数据宽度大于设置的显示宽度N时,不会出现数据无法插入或数据被截断的情况。

2、char(N)与varchar(N)
char(N)和varchar(N)最大的区别在于存储需求空间上的区别上,前者为固定长度,存储需求为N字符长度。
后者为可变长度(“var”意为“variable”,可变的),存储需求为实际值的长度+1(如果N>255,则+2)。
char(N)的N取值范围为255。
mysql> create table t3 (c char(350),v varchar(5));
ERROR 1074 (42000): Column length too big for column 'c' (max = 255); use BLOB or TEXT instead

varchar(N)的N取值范围为65535,超过了自动转换为text类型。
mysql> create table t7 (c char(30),v varchar(65536));
Query OK, 0 rows affected, 1 warning (0.07 sec)

mysql> show warnings ;
+-------+------+--------------------------------------------+
| Level | Code | Message                                    |
+-------+------+--------------------------------------------+
| Note  | 1246 | Converting column 'v' from VARCHAR to TEXT |
+-------+------+--------------------------------------------+
1 row in set (0.00 sec)
mysql> show create table t7 \G
*************************** 1. row ***************************
       Table: t7
Create Table: CREATE TABLE `t7` (
  `c` char(30) DEFAULT NULL,
  `v` mediumtext
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

其中N,不管针对char还是varcahr均有最大字符长度不允许超过N的意思,接下来测试一下。
1)建表tb1.
mysql> create table tb1 (c char(3),v varchar(5));
Query OK, 0 rows affected (0.08 sec)
2)向表中插入数据,实际要插入的数据大于设置的最大字符长度,插入数据时,产生了报警。
<span style="color:#333333;">mysql> insert into tb1 values('1234','123456');
Query OK, 1 row affected, </span><span style="color:#ff0000;">2 warnings</span><span style="color:#333333;"> (0.03 sec)
</span>

查看报警内容,内容显示,针对字段c和字段v插入的数据被修剪了。
mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'c' at row 1 |
| Warning | 1265 | Data truncated for column 'v' at row 1 |
+---------+------+----------------------------------------+
2 rows in set (0.00 sec)

再看下报表内容,数据确实被修剪。修剪后保留的长度为设置的N值长度。
mysql> select * from tb1;
+------+-------+
| c    | v     |
+------+-------+
| 123  | 12345 |
+------+-------+
1 row in set (0.00 sec)

如果将sql mode设置为TRADITIONAL模式,上面的数据是无法插入的。
mysql> set @@sql_mode=TRADITIONAL;  
Query OK, 0 rows affected (0.00 sec)
mysql> create table t2 (c char(3),v varchar(5));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into t2 values('1234','123456');
ERROR 1406 (22001): Data too long for column 'c' at row 1
mysql> select * from t2;
Empty set (0.00 sec)

3、varchar(50)和varchar(100)是否一样?
硬盘存储需求一样,内存需求不一样。即对于VARCHAR数据类型来说,硬盘上的存储空间是根据实际字符长度来分配存储空间的,而对于内存来说,是使用N个字符空间的内存块来保存值,即varchar(50)占用50个字符内存空间,varchar(100)占用100个字符内存空间。

### MySQLVARCHARCHAR的区别 在MySQL中,`VARCHAR` `CHAR` 是两种常用的字符串数据类型,它们在存储方式、性能特性以及适用场景上存在显著差异。 #### 存储方式 `CHAR` 是固定长度的字符串类型,其存储长度由定义时指定的长度决定,无论实际存储的数据长度如何,都会占用定义的全部存储空间。例如,`CHAR(10)` 类型的字段,即使存储的是一个长度为3的字符串,也会占用10个字符的存储空间[^1]。 相比之下,`VARCHAR` 是可变长度的字符串类型,它只占用实际需要的存储空间加上1或2个字节的长度信息。这意味着,如果存储的数据长度变化较大,使用 `VARCHAR` 可以有效节省存储空间。具体来说,当实际字节数不超过255个字节时,使用一个字节记录长度;超过255个字节时,则使用两个字节记录长度[^3]。 #### 性能特性 对于 `CHAR` 类型,由于其固定长度的特性,使得在进行数据检索时,数据库可以更快地定位到数据的位置,从而可能带来一定的性能优势。然而,这种优势往往伴随着较高的存储成本[^1]。 而对于 `VARCHAR` 类型,尽管其可变长度的特性可能导致数据检索时需要额外的计算来确定数据的实际位置,但随着MySQL版本的不断升级,`VARCHAR` 类型的性能也在不断改进并提高。特别是在处理那些经常需要修改而容易形成碎片的数据表时,`VARCHAR` 类型的优势更为明显[^1]。 #### 适用场景 对于 `MyISAM` 存储引擎,推荐使用 `CHAR` 类型,尤其是对于那些经常需要修改的数据表,因为 `CHAR` 类型有助于减少数据碎片[^1]。 而对于 `InnoDB` 存储引擎,由于其内部存储机制的特点,使用 `CHAR` 类型并不一定比使用 `VARCHAR` 类型更好。实际上,考虑到 `CHAR` 类型通常会占用更多的存储空间,从减少空间占用量减少磁盘 I/O 的角度来看,使用 `VARCHAR` 类型反而更有利[^2]。 综上所述,选择 `CHAR` 还是 `VARCHAR` 类型,应根据具体的使用场景需求来决定,权衡存储效率性能之间的关系。 ```sql -- 示例:创建包含CHARVARCHAR类型的表 CREATE TABLE example_table ( id INT PRIMARY KEY, char_column CHAR(10), varchar_column VARCHAR(10) ); ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值