MySql 字符串类型 - char、varchar

612 阅读3分钟
  • 字符串类型常用的包括: char、varchar、text、enum、set

  • 定长字符类型 char

    适用于存储的字符长度为固定长度的字符,比如中国邮政编码,中国身份证号码,手机号码等。 设定形式: 字段名称 char(字符个数)

    其特点是: 1、存储的字符长度固定,最长可设定为255个字符 2、如果实际写入的字符不足设定长度,内部会自动用空格填充到设定的长度。 3、相对varchar类型,其存取速度更快。


  • 变长字符类型 varchar

    适用于存储字符长度经常不确定的字符,比如姓名,用户名,标题,内容,等大多数场合的字符。 设定形式: 字段名称 varchar(字符个数)

    其特点是: 1、存储的字符长度是写入的实际长度,但不超过设定的长度。最长可设定为65532 (字节)。 (1)、注:由于其最长的限制是字节数,因此存储中文和英文的实际字符个数是不同的; (2)、英文:一个字符占一个字节; (3)、中文(gbk编码) :一个字符占2个字节; (4)、中文(uf8编码) :一个字符占3个字节;

    2、如果实际写入的字符不足设定的长度,就按实际的长度存储。

    3、相对于char字符串,其存职速度相对更慢。


  • charvarchar 区别

    首先明确的是,char的长度是不可变的,而varchar的长度是可变的,

    定义一个 char(10)varchar(10), 如果存进去的是 abcd, 那么char 所占的长度依然为 10,除了字符 abcd 外,后面跟六个空格,而varchar 就立马把长度变为 4 了,取数据的时候,char 类型的要用 trim() 去掉多余的空格,而 varchar 是不需要的。

    char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。

    char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。


mysql> create table charTest (id int auto_increment primary key, code char(6), name varchar(6));
mysql> desc charTest;
+-------+------------+------+-----+---------+----------------+
| Field | Type       | Null | Key | Default | Extra          |
+-------+------------+------+-----+---------+----------------+
| id    | int(11)    | NO   | PRI | NULL    | auto_increment |
| code  | char(6)    | YES  |     | NULL    |                |
| name  | varchar(6) | YES  |     | NULL    |                |
+-------+------------+------+-----+---------+----------------+

mysql> insert into charTest (code, name) values ('123456', '123456');
mysql> select * from charTest;
+----+--------+--------+
| id | code   | name   |
+----+--------+--------+
|  1 | 123456 | 123456 |
+----+--------+--------+

mysql> insert into charTest (code, name) values ('123456789', '123456789');
ERROR 1406 (22001): Data too long for column 'code' at row 1

mysql> insert into charTest (code, name) values ('123456', '123456789');
ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql> insert into charTest (code, name) values ('一二三四五六', '一二三四五六');
mysql> select * from charTest;
+----+--------------------+--------------------+
| id | code               | name               |
+----+--------------------+--------------------+
|  1 | 123456             | 123456             |
|  2 | 一二三四五六       | 一二三四五六       |
+----+--------------------+--------------------+