场景与痛点
在实际开发中,我们常会遇到存储为字符串的数字需要按数值大小排序的情况。比如服务器 ID、版本号等字段,如果直接对 VARCHAR 类型进行 ORDER BY,数据库会按字典序比较,导致结果不符合预期(例如 10 排在 2 前面)。
这时候就需要显式地将字符串转换为整数类型。
两种主流方案
MySQL 原生提供了两个函数来实现类型转换:CAST() 和 CONVERT()。它们都能把表达式的值转换成指定的数据类型。
支持的类型包括 BINARY、CHAR、DATE、DATETIME、DECIMAL、SIGNED、TIME、UNSIGNED 等。针对整数转换,我们主要关注 SIGNED(有符号)和 UNSIGNED(无符号)。
代码示例
假设表结构中有 server_id 字段,我们需要获取 game_id = 1 的记录,并按 server_id 的数值降序取前 10 条。
使用 CAST 写法:
SELECT server_id FROM cardserver
WHERE game_id = 1
ORDER BY CAST(server_id AS SIGNED) DESC
LIMIT 10;
或者使用 CONVERT:
SELECT server_id FROM cardserver
WHERE game_id = 1
ORDER BY CONVERT(server_id, SIGNED) DESC
LIMIT 10;
注意事项
虽然这两个函数能解决问题,但要注意以下几点:
- 非数字内容:如果字段中包含无法转换为数字的字符串(如 'abc'),转换结果通常为 0,这可能会干扰排序逻辑。
- 性能影响:在 WHERE 子句中对列进行函数转换会导致索引失效,建议仅在 ORDER BY 或 SELECT 列表中使用。
- 风格统一:CAST 更符合 ANSI SQL 标准,跨数据库迁移时兼容性更好;CONVERT 则是 MySQL 特有的扩展语法。

