首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL VARCHAR 轉 INT 類型的兩大核心函數實戰指南

     編輯:MySQL 資料庫相關知識

業務場景

當字符串字段存儲純數字(如 ID、排序值)需按數值排序或篩選時,隱式轉換會導致索引失效。必須顯式轉型:

核心函數對比:CAST vs CONVERT

特性CAST(expr AS type)CONVERT(expr, type)
語法標準SQL:2003 標準MySQL 擴展/ODBC 風格
可讀性高(類函數調用)中
支援類型BINARY, CHAR, DATE, DATETIME, DECIMAL, SIGNED, TIME, UNSIGNED同左
性能基本一致基本一致

實戰範例

場景 1:VARCHAR 主鍵按數值排序

-- 推薦: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;

場景 2:業務表主鍵遷移排序

-- 有符號整數(可存負數)
SELECT * FROM gyzd_yysinfo 
ORDER BY CAST(yysid AS SIGNED INTEGER);

-- 無符號整數(僅正數,範圍翻倍)
SELECT * FROM gyzd_yysinfo 
ORDER BY CAST(yysid AS UNSIGNED INTEGER);

避坑指南

  1. 非數字字符處理:CAST('123abc' AS SIGNED) → 123(截取前導數字)並產生 Warning
  2. 空字符串:CAST('' AS SIGNED) → 0
  3. NULL 值:轉換結果仍為 NULL
  4. 溢出風險:超出目標類型範圍會截斷,建議搭配 CASE WHEN 預校驗

性能優化建議

  • 避免在 WHERE 條件中對列轉型:WHERE CAST(col AS SIGNED) > 100 無法用到索引
  • 建議方案:新增虛擬列 col_int INT GENERATED ALWAYS AS (CAST(col AS SIGNED)) STORED 並建索引(MySQL 5.7+)
  • 或應用層寫入時同步維護:數值冗余列,空間換時間

掌握顯式類型轉換,是解決「字符串存數字」歷史包袱的關鍵技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved