mysql bigint varchar_mysql 中int和varchar的长度

mysql 字段中int后面所跟数字有何意义? varchar后的数字又有何意义?

mysql> create table t(a int(1));

Query OK, 0 rows affected (0.10 sec)

mysql> insert into t values(123);

Query OK, 1 row affected (0.02 sec)

mysql> insert into t values(12345678);

Query OK, 1 row affected (0.03 sec)

mysql> select * from t;

+----------+

| a |

+----------+

| 123 |

| 12345678 |

+----------+

可见,int(1)并不表示一个字节。

如果更长的数字会不会报错?

mysql> insert into t values(1234567812345678);

ERROR 1264 (22003): Out of range value for column 'a' at row 1

mysql> insert into t values(2147483648);

ERROR 1264 (22003): Out of range value for column 'a' at row 1

mysql> insert into t values(2147483647);

Query OK, 1 row affected (0.03 sec)

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

mysql> alter table t add column b int;

Query OK, 5 rows affected (0.25 sec)

mysql> insert into t values(2147483647,2147483648);

ERROR 1264 (22003): Out of range value for column 'b' at row 1

mysql> insert into t values(2147483647,2147483647);

Query OK, 1 row affected (0.03 sec)

mysql> select * from t;

+------------+------------+

| a | b |

+------------+------------+

| 123 | NULL |

| 12345678 | NULL |

| 65536 | NULL |

| 1073741824 | NULL |

| 2147483647 | NULL |

| 2147483647 | 2147483647 |

+------------+------------+

6 rows in set (0.00 sec)

可见,int后是否跟数字与最大值没有关系。

再看char 和varchar后的数字

mysql> alter table t add column c char(2);

Query OK, 6 rows affected (0.17 sec)

Records: 6 Duplicates: 0 Warnings: 0

mysql> alter table t add column d varchar(2);

Query OK, 6 rows affected (0.17 sec)

Records: 6 Duplicates: 0 Warnings: 0

mysql> desc t;

+-------+------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+------------+------+-----+---------+-------+

| a | int(1) | YES | | NULL | |

| b | int(11) | YES | | NULL | |

| c | char(2) | YES | | NULL | |

| d | varchar(2) | YES | | NULL | |

+-------+------------+------+-----+---------+-------+

4 rows in set (0.01 sec)

mysql> insert into t values(2147483647,2147483647,'abc','abc');

ERROR 1406 (22001): Data too long for column 'c' at row 1

mysql> insert into t values(2147483647,2147483647,'ab','abc');

ERROR 1406 (22001): Data too long for column 'd' at row 1

mysql> insert into t values(2147483647,2147483647,'ab','ab');

Query OK, 1 row affected (0.02 sec)

可见char和varchar后的数字是存储长度。

那么对于中文字,会不会有字节数大于字数而溢出的问题呢?

mysql> insert into t values(2147483647,2147483647,'ab','中化');

Query OK, 1 row affected (0.02 sec)

mysql> select * from t;

+------------+------------+------+------+

| a | b | c | d |

+------------+------------+------+------+

| 123 | NULL | NULL | NULL |

| 12345678 | NULL | NULL | NULL |

| 65536 | NULL | NULL | NULL |

| 1073741824 | NULL | NULL | NULL |

| 2147483647 | NULL | NULL | NULL |

| 2147483647 | 2147483647 | NULL | NULL |

| 2147483647 | 2147483647 | ab | ab |

| 2147483647 | 2147483647 | ab | 中化 |

+------------+------------+------+------+

8 rows in set (0.00 sec)

中文字也是包含在2个字内的。

mysql> insert into t values(2147483647,2147483647,'ab','中化a');

ERROR 1406 (22001): Data too long for column 'd' at row 1

mysql> insert into t values(2147483647,2147483647,'ab','烎镕');

Query OK, 1 row affected (0.05 sec)

mysql> select * from t;

+------------+------------+------+------+

| a | b | c | d |

+------------+------------+------+------+

| 123 | NULL | NULL | NULL |

| 12345678 | NULL | NULL | NULL |

| 65536 | NULL | NULL | NULL |

| 1073741824 | NULL | NULL | NULL |

| 2147483647 | NULL | NULL | NULL |

| 2147483647 | 2147483647 | NULL | NULL |

| 2147483647 | 2147483647 | ab | ab |

| 2147483647 | 2147483647 | ab | 中化 |

| 2147483647 | 2147483647 | ab | 烎镕 |

+------------+------------+------+------+

9 rows in set (0.01 sec)

多一个字节都不行。

看一下字符编码。mysql字符编码由服务器,数据库,表,字段四级组成。

在windows下的mysql设置:

mysql> show variables like "character%";

+--------------------------+--------------------------+

| Variable_name | Value |

+--------------------------+--------------------------+

| character_set_client | gbk |

| character_set_connection | gbk |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | gbk |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | D:\mysql\share\charsets\ |

+--------------------------+--------------------------+

8 rows in set (0.00 sec)

mysql> show create table t;

t | CREATE TABLE `t` (

`a` int(1) DEFAULT NULL,

`b` int(11) DEFAULT NULL,

`c` char(2) DEFAULT NULL,

`d` varchar(2) DEFAULT NULL

ENGINE=InnoDB DEFAULT CHARSET=utf8

linux下centos设置:

mysql> show variables like "character%";

+--------------------------+----------------------------+

| Variable_name | Value |

+--------------------------+----------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /opt/mysql/share/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.00 sec)

mysql> show full fields from t;

mysql> show create database test;

CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */

字符编码是utf8,

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值