mysql中int和varchar的长度详解

int

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

varchar

长度是0-255个字符哦

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','?糸F');
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   | ?糸F |
+------------+------------+------+------+
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:mysqlsharecharsets |
+--------------------------+--------------------------+
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后面的数字,无论是中文还是英文,都表示相应的字数,不用担心截断。

时间: 2024-09-21 11:03:28

mysql中int和varchar的长度详解的相关文章

MySQL中replace into语句的用法详解_Mysql

在向表中插入数据的时候,经常遇到这样的情况: 1.首先判断数据是否存在: 2.如果不存在,则插入: 3.如果存在,则更新.   在 SQL Server 中可以这样写: 复制代码 代码如下: if not exists (select 1 from table where id = 1) insert into table(id, update_time) values(1, getdate()) else update table set update_time = getdate() whe

mysql中date_add与date_sub函数使用详解

mysql 中 DATE_ADD(date,INTERVAL expr type) 和 DATE_SUB(date,INTERVAL expr type) 这些函数执行日期运算. date 是一个 DATETIME 或DATE值,用来指定起始时间. expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值.  Expr是一个字符串;对于负值的时间间隔,它可以以一个 '-'开头. type 为关键词,它指示了表达式被解释的方式. 关键词INTERVA及 type 分类符均不区分大小写. m

mysql中null,not null,default,auto_increment详解

NULL 和 NOT NULL 修饰符: 可以在每个字段后面都加上这NULL 或 NOT NULL 修饰符来指定该字段是否可以为空(NULL),还是说必须填上数据(NOT NULL).MySQL默认情况下指定字段为NULL修饰符,如果一个字段指定为NOT NULL,MySQL则不允许向该字段插入空值(这里面说的空值都为NULL),因为这是"龟定".  代码如下 复制代码 /* 创建好友表,其中id ,name ,pass都不能为空 */ create table friends ( i

MySQL中Update与Insert语句用法详解

MySQL 更新数据 Update 语句 update 语句的定义: UPDATE语法可以用新值更新原有表行中的各列.让我们先来看一下update语句标准的定义,放在[]内的都是可以省略的:  代码如下 复制代码 UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] s

Mysql中order by语句的优化详解

在某些情况中,MySQL可以使用一个索引来满足ORDER BY子句,而不需要额外的排序.where条件和order by使用相同的索引,并且order by的顺序和索引顺序相同,并且order by的字段都是升序或者都是降序. 一.建议使用一个索引来满足Order By子句. 在条件允许的情况下,笔者建议最好使用一个索引来满足Order By子句.如此的话,就可以避免额外的排序工作.这里笔者需要强调的一点是及时Order By子句不确切匹配索引,但是只要Where子句中所有未使用的索引部分和所有

Oracle中varchar2字符类型最大长度详解

varchar2的最大存储长度是4000. 如以下语句: create table test(id varchar2(4001));执行时会报错. 如果将语句改为如下,则会执行成功. create table test(id varchar2(4000)); 问题分析 当用在定义表的类型时,varchar2的最大长度是4000个字节,如下图1所示,当超过的时候就会报错: 图1: 而当作PL/SQL程序中定义变量使用的时候,限制大小为32767个字节,所能存储的字符个数取决于字符集设置,如下图2所

Mysql中where与having用法区别详解

让我们先运行2个sql语句:  代码如下 复制代码 SELECT * FROM `welcome` HAVING id >1 LIMIT 0 , 30 SELECT * FROM `welcome` WHERE id >1 LIMIT 0 , 30 查看一下结果吧,怎么样?是不是查询到相同的结果. 让我们再看2个sql语句:  代码如下 复制代码 SELECT user, MAX(salary) FROM users GROUP BY user HAVING MAX(salary)>10

Mysql中Btree 与 Hash 索引比较详解

mysql最常用的索引结构是btree(O(log(n))),但是总有一些情况下我们为了更好的性能希望能使用别的类型的索引.hash就是其中一种选择,例如我们在通过用户名检索用户id的时候,他们总是一对一的关系,用到的操作符只是=而已,假如使用hash作为索引数据结构的话,时间复杂度可以降到O(1).不幸的是,目前的mysql版本(5.6)中,hash只支持MEMORY和NDB两种引擎,而我们最常用的INNODB和MYISAM都不支持hash类型的索引. 不管怎样,还是要了解一下这两种索引的区别

mysql中ASCII、ORD函数用法详解

一,ASCII(str1) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL 举例: 1.  代码如下 复制代码 mysql> select ascii('hi'); +-----+ | ascii('hi') | +-----+ |         104 | +-----+ 1 row in set 104是h的ASCII值 2.输出b和B的ASCII值  代码如下 复制代码 mysql> SELECT ASCII('b')A