MySQL 的 char 与 varchar

Mysql  /  houtizong 发布于 3年前   229


今天发现,create table 时,MySQL 4.1有时会把 char 自动转换成 varchar

测试举例:
CREATE TABLE `varcharLessThan4` (  `lastName` varchar(3)) ;mysql> desc varcharLessThan4;+----------+---------+------+-----+---------+-------+| Field    | Type    | Null | Key | Default | Extra |+----------+---------+------+-----+---------+-------+| lastName | char(3) | YES  |     | NULL    |       |+----------+---------+------+-----+---------+-------+1 row in set (0.01 sec)CREATE TABLE `charGreaterThan4` (  `firstName` char(4),  `lastName` varchar(4)) ;mysql> desc charGreaterThan4;+-----------+------------+------+-----+---------+-------+| Field     | Type       | Null | Key | Default | Extra |+-----------+------------+------+-----+---------+-------+| firstName | varchar(4) | YES  |     | NULL    |       || lastName  | varchar(4) | YES  |     | NULL    |       |+-----------+------------+------+-----+---------+-------+2 rows in set (0.00 sec)CREATE TABLE `charLessThan4` (  `firstName` char(3),  `lastName` varchar(4)) ;mysql> desc charLessThan4;+-----------+------------+------+-----+---------+-------+| Field     | Type       | Null | Key | Default | Extra |+-----------+------------+------+-----+---------+-------+| firstName | char(3)    | YES  |     | NULL    |       || lastName  | varchar(4) | YES  |     | NULL    |       |+-----------+------------+------+-----+---------+-------+2 rows in set (0.00 sec)


事实上, MySQL 5 之前有这样的规则:
1.如果表中有 varchar 类型的列,那表中其他 char 类型的列:
a.如果 char 的长度大于等于4,那就会转换成 varchar
b.如果 char 的长度小于4,那不会转换
2. varchar 的长度小于4,则会转换成 char
官方文档参考:http://dev.mysql.com/doc/refman/4.1/en/silent-column-changes.html

但到了 MySQL 5.1又不一样了,以上所有测试在 MySQL 5.1中都不会做自动转换

《高性能 MySQL》一书中提到, varchar 要用额外的空间来保存长度

因此我们容易认为,尽量用 char 而不是 varchar

但现实中,很多情况下,表里都会有 varchar 的字段,在这样的表中,其他字段即使你可以定义为 char,也不能提升速度

原文:

Note that using CHAR will only speed up your access if the whole record is fixed size. That is, if you use any variable size object, you might as well make all of them variable size. You gain no speed by using a CHAR in a table that also contains a VARCHAR.

因此,实际中可以统一使用 varchar 而不必考虑过多

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客