`

MySQL 的 char 与 varchar

阅读更多


今天发现,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 而不必考虑过多
1
1
分享到:
评论

相关推荐

    对比MySQL中int、char以及varchar的性能

    在本篇文章中我们给大家分享了关于MySQL中int、char以及varchar的性能对比的相关内容,有兴趣的朋友们学习下。

    char和varchar在mysql中的效率怎样.docx

    char和varchar在mysql中的效率怎样.docx

    MySQL CHAR和VARCHAR存储、读取时的差别

    你真的知道CHAR和VARCHAR类型在存储和读取时的区别吗? 还是先抛几条结论吧: 1、存储的时候,CHAR总是会补足空格后再存储,不管用户插入数据时尾部有没有包含空格。 2、存储的时候,VARCHAR不会先补足空格后再存储...

    MYSQL中 char 和 varchar的区别

    CHAR和VARCHAR类型相似,差别主要在存储,尾随空格和检索方式上。 CHAR和VARCHAR相同的是:CHAR和VARCHAR都指定了字符长度,注意是字符长度。例如char(30) 和 varchar(30)表示都可以存30个字符。有一点要注意的是在...

    mysql中char与varchar的区别分析

    char与varchar的区别 char (13)长度固定, 如’www.jb51.net’ 存储需要空间 12个字符 varchar(13) 可变长 如’www.jb51.net’ 需要存储空间 13字符, 从上面可以看得出来char 长度是固定的,不管你存储的数据是多少...

    MySQL数据库char与varchar的区别分析及使用建议

    一、VARCHAR与CHAR字符型数据的差异 在MySQL数据库中,用的最多的字符型数据类型就是Varchar和Char.。这两种数据类型虽然都是用来存放字符型数据,但是无论从结构还是 从数据的保存方式来看,两者相差很大。而且其...

    浅析Oracle中char和varchar2的区别 电脑资料.docx

    浅析Oracle中char和varchar2的区别 电脑资料.docx

    MySQL中CHAR和VARCHAR类型演变和详解

    MySQL数据库的varchar类型在5.0.3以下的版本中的最大长度限制为255,其数据范围可以是0~255

    MySQL中字段类型char、varchar和text的区别

    在MySQL中,char、varchar和text类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。 它们的存储方式和数据的检索方式也都不一样。 数据的检索效率是:char > varchar ...

    Mysql中varchar长度设置方法

    主要介绍了Mysql中varchar长度设置方法的相关资料,本文还给大家带来了valar类型的变化及char()和varchar()的区别介绍,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    MySQL中VARCHAR与CHAR格式数据的区别

    char是一种固定长度的类型,varchar则是一种可变长度的类型,那么他们具体使用过程中有什么区别吗

    MySQL中把varchar类型转为date类型方法详解

    如下表: 先使用str_to_date函数,将其varchar类型转为日期类型,然后从小到大排序 ...SELECT to_char(to_date(m.ma_datetime,'yyyy-MM-dd hh24:mi:ss'), 'yyyyMMdd') FROM my_task m; m.ma_datet

Global site tag (gtag.js) - Google Analytics