mysqlvar和string_mysql数据库varvarcharint简单说明
在使⽤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参数。
mysql>  create table tb2 (id1 int(3) zerofill,id2 int(5) zerofill);
Query OK, 0 rows affected (0.08 sec)
5)向tb2中插⼊与tb1中同样的数据。
mysql> insert into tb2 values(12,12345);
Query OK, 1 row affected (0.05 sec)
6)查看表tb2的内容。
mysql> select * from tb2;
+------+-------+
| id1  | id2  |
+------+-------+
|  012 | 12345 |
+------+-------+
1 row in set (0.00 sec)
相⽐于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)
varchar2最大长度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)向表中插⼊数据,实际要插⼊的数据⼤于设置的最⼤字符长度,插⼊数据时,产⽣了报警。mysql> insert into tb1 values('1234','123456');
Query OK, 1 row affected,
2 warnings(0.0
3 sec)
查看报警内容,内容显⽰,针对字段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个字符内存空间。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。