MySQL——字符串类型——char(n) 和 varchar(n)

哎哟,听你这么一说,感觉你挺懂这个的啊。
不过我得跟你唠唠,我以前搞开发的时候,这块儿真给我坑过不少次。

我跟你讲啊,大概在十年前吧,我带个小团队做一个电商平台,数据库设计那会儿,我们就有争论。
一个哥们儿非要说用char(1 0)存用户名,理由就是char固定长度,查起来快。
我当时就琢磨,这用户名长短不一啊,用char是不是有点浪费空间?后来还是用了varchar(5 0),结果发现空间省了不少,而且用户名偶尔有长有短,char反而得补空格,更占地方。
这事儿让我印象特别深,那会儿服务器成本还没现在这么低,每一M都得抠。

再比如,存身份证号,那必须得用char(1 8 ),这长度固定,查效率高。
你想啊,身份证号就1 8 个字符,用varchar还得额外存一个字节记录长度,不划算。

所以你看,用啥得看场景。
像国家代码这种,就两三个字符,用char(3 )挺好。
但像用户名、地址这种,长度变化大,用varchar省着呢。
而且现在数据库都挺智能的,对varchar优化得也好了,别老觉得char就一定快了。
我这十年踩坑下来,感觉varchar用得更多。

你问现在还有坑吗?嗯... 坑是肯定有,但都是细活儿。
比如你用varchar存日期,还得自己转格式,一不小心就出问题。
这块我没碰过,不敢乱讲。

mysql 字段类型有哪些

哎哟,说到MySQL的字段类型,那可多了去了,我给你详细说说。

数值类型嘛,得先说严格数值类型,就像INTEGER(INT)、SMALLINT、DECIMAL(DEC)和NUMERIC这些,它们都是用来存储精确数值的。
比如DECIMAL,这货就是用来存精确小数的,你得指定它能存储的总位数(M)和小数位数(D)。
然后呢,还有近似数值类型,比如FLOAT(单精度浮点数)和DOUBLE PRECISION(双精度浮点数),这俩玩意儿呢,一般用在科学计算这类场合。

再来说说整数类型,MySQL这扩展得挺彻底的,比如TINYINT(1 字节,范围-1 2 8 至1 2 7 )、MEDIUMINT(3 字节,范围-8 ,3 8 8 ,6 08 至8 ,3 8 8 ,6 07 )和BIGINT(8 字节,范围极大)。
这个BIT类型也挺有意思,专门用来存位字段值,支持多种存储引擎。

日期和时间类型嘛,这可是关键,比如DATE(3 字节,存储日期,范围1 000-01 -01 至9 9 9 9 -1 2 -3 1 ),TIME(3 字节,存储时间或持续时间,范围-8 3 8 :5 9 :5 9 至8 3 8 :5 9 :5 9 ),YEAR(1 字节,存储年份,范围1 9 01 至2 1 5 5 ),DATETIME(8 字节,存储日期和时间组合),TIMESTAMP(4 字节,存储时间戳,范围1 9 7 0-01 -01 00:00:00至2 03 8 年1 月1 9 日),这玩意儿自动更新的特性挺实用。

字符串类型呢,分为字符字符串和二进制字符串。
字符字符串有CHAR(定长字符串,0-2 5 5 字节,存储时尾部空格会被保留)和VARCHAR(变长字符串,0-6 5 ,5 3 5 字节,存储效率更高)。
TEXT系列,像TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,这些都是用来存储长文本数据的。
然后是ENUM,从预定义值列表中选择单个值,SET呢,从预定义值列表中选择多个值。

二进制字符串呢,有BINARY(定长二进制字符串,0-2 5 5 字节,排序和比较基于字节数值)和VARBINARY(变长二进制字符串,0-6 5 ,5 3 5 字节)。
BLOB系列,TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,这些都是用来存储二进制数据的,比如图片、文件。

选字段类型啊,得根据数据特性(精度、长度、存储需求)和查询性能优化需求来权衡。
说实话,我当时也没想明白,现在用了这么多年,慢慢也就明白了。

MysQL中Text、 Long、 Medium、 MediumBund有何区别?

我记得有一次,我在做一个关于历史文献的数据库项目,需要存储大量的古文资料。
那时候,我就在想,如果直接用普通的VARCHAR类型,那肯定是不够用的。
于是,我就对比了一下text、mediumtext和longtext三种类型。

我查了一下资料,发现text可以存储6 5 ,5 3 5 个字符,这对于一些普通的文章或者短小的描述是够用的。
但是,我的古文资料平均下来每篇都有上万字,那6 5 ,5 3 5 个字符显然是不够的。
然后我又看了mediumtext,它支持1 6 ,7 7 7 ,2 1 5 个字符,看起来挺不错的,但我的资料还是不够用。

最后,我选择了longtext,它可以存储4 ,2 9 4 ,9 6 7 ,2 9 5 个字符,这个数字对于我的项目来说,可以说是足够了。
但是,我也发现了一个问题,就是随着存储的数据越来越大,数据库的查询效率会受到影响。
我甚至想过,如果资料再增加,我可能需要考虑使用分布式数据库或者更高级的数据存储方案。

所以,我就在想,对于不同的应用场景,我们到底应该怎么选择合适的字符串类型呢?是不是还有其他的优化方案呢?

mysql数据类型有哪些

上周有个客人问我MySQL数据类型选哪个最合适,我跟他绕了半天,最后发现直接上例子最清楚。

你想想看啊,比如做个订单表,金额肯定不能随便用FLOAT,那小数点后两位可能就丢了。
我之前在某个电商项目里,财务那边死活要求用DECIMAL(1 0,2 ),不然账对不上。
那个INT(1 0)啊,我当年就被坑过,以为存1 0位数就行,结果人家是按ZEROFILL来的,比如INT(1 0) ZEROFILL存个1 ,实际只占1 位,还隐式加了UNSIGNED,真是气人。

日期类型我常用TIMESTAMP,特别是有业务逻辑要自动更新的场景。
我记得2 02 2 年在深圳做那个预约系统,表里一共有三列日期:创建时间用TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,签到时间用DATETIME存具体点到的,过期时间用DATE存年月日。
那会儿试过加第二列TIMESTAMP自动更新,直接报错,MySQL就是这么霸道。
TIME类型我也爱用,比如仓库出入库时间,秒数都不要,-8 3 8 :5 9 :5 9 到8 3 8 :5 9 :5 9 范围够用了。

字符串类型里,CHAR(1 )存状态值('Y','N')最稳,反正就一个字符。
BLOB和TEXT我现在基本不用,项目里都是用VARCHAR(2 5 5 )搞定,除非真要存图片文件路径。
ENUM和SET我倒是用得挺多,比如性别选'男','女','未知',就用ENUM;口味选辣/不辣/酸甜,就用SET。
那个ENUM('0','1 ','2 ')插入'3 '存成'2 '的bug,我2 02 1 年在一个旧系统里就踩过,直接导致统计错误,真是笑死。

你具体想搞哪个类型啊?我帮你看看。