函數用法
FORMAT(number, decimal_places [, locale])
number:要格式化的數字
decimal_places:小數位數 (四捨五入)
locale (可選):地區設定,影響千分位分隔符與小數點符號,預設 en_US
基本範例
SELECT FORMAT(123456789, 0); -- 123,456,789
SELECT FORMAT(1234567.89, 2); -- 1,234,567.89
SELECT FORMAT(1234567.891, 2); -- 1,234,567.89 (四捨五入)
SELECT FORMAT(1234567.89, 2, 'de_DE'); -- 1.234.567,89 (德語地區:點分千位、逗號小數點)
實戰場景
1. 報表金額顯示
SELECT
order_id,
FORMAT(total_amount, 2) AS amount_formatted,
FORMAT(tax_amount, 2) AS tax_formatted
FROM orders
WHERE created_at >= '2024-01-01';
2. 統計數字可讀性
SELECT
'Total Users' AS metric,
FORMAT(COUNT(*), 0) AS value
FROM users
UNION ALL
SELECT
'Total Orders',
FORMAT(COUNT(*), 0)
FROM orders;
3. 多地區化報表
-- 系統根據用戶語言動態選擇 locale
SELECT
FORMAT(price, 2,
CASE user_lang
WHEN 'zh_CN' THEN 'zh_CN'
WHEN 'en_US' THEN 'en_US'
WHEN 'de_DE' THEN 'de_DE'
ELSE 'en_US'
END
) AS price_display
FROM products;
注意事項
| 項目 | 說明 |
| 返回類型 | CHAR/VARCHAR (字串),非數值類型,不可直接參與數學運算 |
| NULL 處理 | FORMAT(NULL, 2) 返回 NULL |
| 負數 | 保留負號:FORMAT(-1234.5, 1) → -1,234.5 |
| 大數字 | 支援超大整數,但超過 DOUBLE 精度範圍可能失真 |
| 效能 | 字串格式化較慢,大量列建議應用層處理或僅在最終 SELECT 使用 |
替代方案:應用層格式化
-- Python
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
formatted = locale.format_string('%,.2f', 1234567.89) # '1,234,567.89'
-- Java
NumberFormat.getNumberInstance(Locale.US).format(1234567.89)
-- JavaScript
(1234567.89).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})
總結
FORMAT(N, D):快速產生千分位字串,適合報表、日誌、少量查詢
- 返回**字串**,後續計算需先
CAST(... AS DECIMAL)
- 高頻/大量資料場景建議**應用層格式化**,減輕資料庫 CPU
- 支援
locale 參數實現國際化顯示