帮助中心/最新通知

质量为本、客户为根、勇于拼搏、务实创新

< 返回文章列表

【服务器相关】详解隐秘的 MySQL 类型转换问题详解

发表时间:2025-06-16 03:46:00 小编:主机乐-Yutio

1、问题开篇

本文来自于我近期工作中遇到的一个真实问题,稍作整理后分享给大家~

一张用户表,其中 phone 添加了普通索引:

2、数值型查询

发现问题:

当索引字段 `phone` 为字符串类型时,字符串查询时候使用了索引`idx_phone`,而数值类型查询时候竟无法使用索引`idx_phone`。

2、问题引申

假如索引字段为整型的话,那用字符串查询时会不会走索引呢?

实践出真知,我们来验证一下。

同样如上表,修改字段 `phone` 类型由 varchar 变更为 bigint:

2、数值型查询

执行后发现,无论是以字符串查询还是以数值型查询都会用到索引。

小结:

  • 当索引字段是数值类型时,数值型或者字符型查询都不影响索引的使用。
  • 当索引字段是字符类型时,数值型查询无法使用索引,字符型查询可正常使用索引。

3、跟进探究

为什么会是这样呢?其根源就是 MySQL 的隐式类型转换。

3.1 什么是隐式类型转换?

在 MySQL 中,当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容,则会发生隐式类型转换。

即 MySQL 会根据需要自动将数字转换为字符串,或者将字符串转换为数字。

结果显示同应用字符串类型参数一样,可使用索引`idx_phone`。

3.2.3 类型保持一致

最简单的一种,保证查询应用规范,SQL 参数类型与数据库中字段类型保持一致即可。

3.3 字符类型转换

另外,关于字符串类型转换的一些补充:


mysql> select ‘1a2b3c’ = 1;
-> 1
mysql> select ‘a1b2c3’ = 0;
-> 1

从上面的例子可以得出:

  • 如果字符串的第一个字符就是非数字的字符,那么转换为数字就是 0;
  • 如果字符串以数字开头,那转换的数字就是开头的那些数字对应的值,直到遇到非数字字符才结束。

4、总结

本文主要从问题入手,继而进行问题引申,最终挖掘出问题根源:MySQL 隐式类型转换。

同时也告诫我们日常在写 SQL 时一定要检查参数类型与数据库字段类型是否一致,否则可能造成隐式类型转换,不能正常应用索引,造成慢查询,甚至拖垮整个数据库服务集群。

如果参数不一致,也可以考虑使用 CAST 函数显性转换成一致类型。

数据表设计及应用绝非易事,需要考虑的因素太多了,大家应用过程注意保持敬畏心。

本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!


联系我们
返回顶部