首页 > 数据库 > MySQL > 正文

mysql中int和varchar的长度详解

2024-07-24 12:37:18
字体:
来源:转载
供稿:网友

在mysql中一般人可能不会去问int与varchar区别了,这个估计一个数字类型,一个字符类型没有可比性了,同时他们长度也不一样,下面我来介绍一下mysql 中int和varchar的长度一些细节吧.

int:从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer

varcharL长度是0-255个字符.

mysql 字段中int后面所跟数字有何意义?varchar后的数字又有何意义?代码如下:

  1. mysql> create table t(a int(1)); 
  2. Query OK, 0 rows affected (0.10 sec) 
  3. mysql> insert into t values(123); 
  4. Query OK, 1 row affected (0.02 sec) 
  5.  
  6. mysql> insert into t values(12345678); 
  7. Query OK, 1 row affected (0.03 sec) 
  8.  
  9. mysql> select * from t; 
  10. +----------+ 
  11. | a        | 
  12. +----------+ 
  13. |      123 | 
  14. | 12345678 | 
  15. +----------+ 

可见,int(1)并不表示一个字节,如果更长的数字会不会报错?代码如下:

  1. mysql> insert into t values(1234567812345678); 
  2. ERROR 1264 (22003): Out of range value for column 'a' at row 1 
  3. mysql> insert into t values(2147483648); 
  4. ERROR 1264 (22003): Out of range value for column 'a' at row 1 
  5. mysql> insert into t values(2147483647); 
  6. Query OK, 1 row affected (0.03 sec) 

int 型长度最大值是2^31 -1,加上有符号数,应该是四个字节的长度,代码如下:

  1. mysql> alter table t add column b int
  2. Query OK, 5 rows affected (0.25 sec) 
  3. mysql> insert into t values(2147483647,2147483648); 
  4. ERROR 1264 (22003): Out of range value for column 'b' at row 1 
  5. mysql> insert into t values(2147483647,2147483647); 
  6. Query OK, 1 row affected (0.03 sec) 
  7.  
  8. mysql> select * from t; 
  9. +------------+------------+ 
  10. | a          | b          | 
  11. +------------+------------+ 
  12. |        123 |       NULL | 
  13. |   12345678 |       NULL | 
  14. |      65536 |       NULL | 
  15. | 1073741824 |       NULL | 
  16. | 2147483647 |       NULL | 
  17. | 2147483647 | 2147483647 | 
  18. +------------+------------+ 
  19. rows in set (0.00 sec) 

可见,int后是否跟数字与最大值没有关系,再看char 和varchar后的数字,代码如下:

  1. mysql> alter table t add column c char(2); 
  2. Query OK, 6 rows affected (0.17 sec) 
  3. Records: 6  Duplicates: 0  Warnings: 0 
  4.  
  5. mysql> alter table t add column d varchar(2); 
  6. Query OK, 6 rows affected (0.17 sec) 
  7. Records: 6  Duplicates: 0  Warnings: 0 
  8.  
  9. mysql> desc t; 
  10. +-------+------------+------+-----+---------+-------+ 
  11. | Field | Type       | Null | Key | Default | Extra | 
  12. +-------+------------+------+-----+---------+-------+ 
  13. | a     | int(1)     | YES  |     | NULL    |       | 
  14. | b     | int(11)    | YES  |     | NULL    |       | 
  15. | c     | char(2)    | YES  |     | NULL    |       | 
  16. | d     | varchar(2) | YES  |     | NULL    |       | 
  17. +-------+------------+------+-----+---------+-------+ 
  18. rows in set (0.01 sec) 
  19.  
  20. mysql> insert into t values(2147483647,2147483647,'abc','abc'); 
  21. ERROR 1406 (22001): Data too long for column 'c' at row 1 
  22. mysql> insert into t values(2147483647,2147483647,'ab','abc'); 
  23. ERROR 1406 (22001): Data too long for column 'd' at row 1 
  24. mysql> insert into t values(2147483647,2147483647,'ab','ab'); 
  25. Query OK, 1 row affected (0.02 sec) 

可见char和varchar后的数字是存储长度,那么对于中文字,会不会有字节数大于字数而溢出的问题呢?代码如下:

  1. mysql> insert into t values(2147483647,2147483647,'ab','中化'); 
  2. Query OK, 1 row affected (0.02 sec) 
  3.  
  4. mysql> select * from t; 
  5. +------------+------------+------+------+ 
  6. | a          | b          | c    | d    | 
  7. +------------+------------+------+------+ 
  8. |        123 |       NULL | NULL | NULL | 
  9. |   12345678 |       NULL | NULL | NULL | 
  10. |      65536 |       NULL | NULL | NULL | 
  11. | 1073741824 |       NULL | NULL | NULL | 
  12. | 2147483647 |       NULL | NULL | NULL | 
  13. | 2147483647 | 2147483647 | NULL | NULL | 
  14. | 2147483647 | 2147483647 | ab   | ab   | 
  15. | 2147483647 | 2147483647 | ab   | 中化 | 
  16. +------------+------------+------+------+ 
  17. rows in set (0.00 sec) 

中文字也是包含在2个字内的,代码如下:

  1. mysql> insert into t values(2147483647,2147483647,'ab','中化a'); 
  2. ERROR 1406 (22001): Data too long for column 'd' at row 1 
  3. mysql> insert into t values(2147483647,2147483647,'ab','?糸F'); 
  4. Query OK, 1 row affected (0.05 sec) 
  5.  
  6. mysql> select * from t; 
  7. +------------+------------+------+------+ 
  8. | a          | b          | c    | d    | 
  9. +------------+------------+------+------+ 
  10. |        123 |       NULL | NULL | NULL | 
  11. |   12345678 |       NULL | NULL | NULL | 
  12. |      65536 |       NULL | NULL | NULL | 
  13. | 1073741824 |       NULL | NULL | NULL | 
  14. | 2147483647 |       NULL | NULL | NULL | 
  15. | 2147483647 | 2147483647 | NULL | NULL | 
  16. | 2147483647 | 2147483647 | ab   | ab   | 
  17. | 2147483647 | 2147483647 | ab   | 中化 | 
  18. | 2147483647 | 2147483647 | ab   | ?糸F | 
  19. +------------+------------+------+------+ 
  20. rows in set (0.01 sec) 

多一个字节都不行,看一下字符编码,mysql字符编码由服务器,数据库,表,字段四级组成,在windows下的mysql设置,代码如下:

  1. mysql> show variables like "character%"
  2. +--------------------------+--------------------------+ 
  3. | Variable_name            | Value                    | 
  4. +--------------------------+--------------------------+ 
  5. | character_set_client     | gbk                      | 
  6. | character_set_connection | gbk                      | 
  7. | character_set_database   | utf8                     | 
  8. | character_set_filesystem | binary                   | 
  9. | character_set_results    | gbk                      | 
  10. | character_set_server     | utf8                     | 
  11. | character_set_system     | utf8                     | 
  12. | character_sets_dir       | D:mysqlsharecharsets | 
  13. +--------------------------+--------------------------+ 
  14. rows in set (0.00 sec)  //Vevb.com 
  15. mysql> show create table t; 
  16.  t     | CREATE TABLE `t` ( 
  17.  `a` int(1) DEFAULT NULL
  18.  `b` int(11) DEFAULT NULL
  19.  `c` char(2) DEFAULT NULL
  20.  `d` varchar(2) DEFAULT NULL 
  21.  ENGINE=InnoDB DEFAULT CHARSET=utf8 

linux下centos设置,代码如下:

  1. mysql> show variables like "character%"
  2. +--------------------------+----------------------------+ 
  3. | Variable_name            | Value                      | 
  4. +--------------------------+----------------------------+ 
  5. | character_set_client     | utf8                       | 
  6. | character_set_connection | utf8                       | 
  7. | character_set_database   | utf8                       | 
  8. | character_set_filesystem | binary                     | 
  9. | character_set_results    | utf8                       | 
  10. | character_set_server     | utf8                       | 
  11. | character_set_system     | utf8                       | 
  12. | character_sets_dir       | /opt/mysql/share/charsets/ | 
  13. +--------------------------+----------------------------+ 
  14. rows in set (0.00 sec) 
  15. mysql> show full fields from t; 
  16. mysql> show create database test; 
  17. CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ 

字符编码是utf8,因此,对于utf8中文字符,varchar后面的数字,无论是中文还是英文,都表示相应的字数,不用担心截断.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表