MySQLで文字列と数値を相互変換する方法まとめ|CAST・CONVERTの使い方と注意点

目次

1. イントロダクション

MySQLでデータベースを運用していると、「数字として扱いたいデータが文字列型で保存されていた」「文字列のままでは計算や集計ができない」といった場面によく遭遇します。たとえば、ExcelやCSVから取り込んだデータは、数字なのにVARCHAR型やCHAR型になっていることが珍しくありません。そのままでは合計や平均、大小比較といった数値処理が思うようにできず、SQLを書く手も止まってしまいます。

一方で、数値型データを文字列として扱いたい場面もあります。たとえば、IDやコードにゼロ埋めをしたり、テキストとして他のカラムと結合して表示したりするケースです。こうした状況では、数値型を文字列型に変換する処理が必要になります。

このように、「文字列と数値の型変換」はMySQLでデータを自在に操作するための基礎スキルの一つです。適切に型変換を使いこなすことで、データの整合性を保ちつつ、柔軟な集計や加工が可能になります。

本記事では、MySQLにおける「文字列⇔数値」の変換方法とその使い方、さらにはよくある注意点やベストプラクティスまで、現場のノウハウも交えながらわかりやすく解説していきます。初学者の方はもちろん、普段からSQLを書く実務者の方にも役立つ内容になっていますので、ぜひ参考にしてください。

2. MySQLの型変換の種類

MySQLには、データ型を変換するための便利な機能が複数用意されています。ここでは「明示的な型変換」と「暗黙的な型変換」の2つのパターンと、その代表的な方法について解説します。

2.1 明示的な型変換

明示的な型変換とは、SQLの中で「この値を○○型に変換する」とはっきり指定して変換を行う方法です。主に以下の2つの関数がよく使われます。

CAST関数
CAST()は、指定した値を指定した型に変換する標準SQLの関数です。MySQLでも広く使われています。

SELECT CAST('123' AS SIGNED);

この例では、文字列'123'を「符号付き整数型(SIGNED)」に変換しています。他にもUNSIGNED(符号なし整数)、DECIMAL(小数)、CHAR(文字列)、DATE(日付)など、さまざまな型に変換可能です。

CONVERT関数
CONVERT()も、値を他のデータ型に変換するための関数です。書式は以下の通りです。

SELECT CONVERT('456' , UNSIGNED);

この例では、文字列'456'を「符号なし整数型(UNSIGNED)」に変換しています。CAST()との主な違いは、CONVERT()は文字セットの変換にも使われる点です。

2.2 暗黙的な型変換

暗黙的な型変換とは、SQLの演算や比較などを行ったときに、MySQLが自動的に型を変換してくれる仕組みです。
たとえば、数値と文字列を足し算した場合、MySQLは自動的に文字列を数値に変換して計算します。

SELECT 1 + '2';
-- 結果は 3 になる

また、数値を文字列として連結したい場合も同様です。

SELECT CONCAT(10, ' apples');
-- 結果は '10 apples' になる

暗黙的な型変換は便利ですが、意図しない結果を生む場合もあるため、複雑な処理や重要な場面では明示的な型変換を使うことが推奨されます。

3. 文字列→数値変換の実践例

MySQLでは、数値が文字列(CHAR型やVARCHAR型)で格納されている場合、そのままでは計算や数値比較ができません。こういったデータを正しく集計・分析するためには、文字列を数値型に変換する必要があります。ここでは実際によく使われる変換方法と注意点を紹介します。

3.1 CAST関数を使った変換

もっとも基本的な方法は、CAST()関数を使う方法です。たとえば、'100'という文字列を整数に変換するには、次のように記述します。

SELECT CAST('100' AS SIGNED) AS 数値結果;
-- 結果:100(整数)

SIGNEDは符号付き整数、UNSIGNEDは符号なし整数として変換します。小数点のあるデータにはDECIMALFLOATなども使えます。

SELECT CAST('123.45' AS DECIMAL(10,2)) AS 小数結果;
-- 結果:123.45

3.2 CONVERT関数を使った変換

CONVERT()関数もほぼ同様に使えます。

SELECT CONVERT('200', SIGNED) AS 変換結果;
-- 結果:200

どちらも結果は同じですが、CAST()は標準SQLとして移植性が高いため、迷ったときはCAST()を選ぶのがおすすめです。

3.3 演算による暗黙的な変換

SQLの演算式の中で数値型と文字列型を計算すると、自動的に文字列が数値に変換されます。たとえば、次のような使い方です。

SELECT '50' + 25 AS 合計;
-- 結果:75

この仕組みを利用して、集計関数にも応用できます。たとえば、SUM()で文字列型のカラムをそのまま渡すと、MySQLが自動的に数値変換して合計します。

SELECT SUM(金額) FROM 売上データ;
-- 金額カラムがVARCHARでも自動で数値合計

3.4 ゼロパディング文字列や数値以外の値に注意

ゼロ埋めされた文字列(例:’000100’)も数値に変換可能です。

SELECT CAST('000100' AS SIGNED) AS 変換結果;
-- 結果:100

ただし、「数字以外の文字」が混じった場合は要注意です。CAST('abc123' AS SIGNED)のように変換すると、先頭から数字部分がなければ0になってしまいます。データの品質によっては、変換前に入力値のバリデーションを行うことが重要です。

3.5 実務での活用例

  • ExcelやCSVインポートで文字列化された売上や金額データの集計
  • 顧客コードなど、数字なのに文字列型で格納されているIDを数値順で並び替える場合
  • 日付文字列をYYYYMMDD形式で保存しているときに日付順ソートしたい場合(後述)

4. 数値→文字列変換の実践例

MySQLで数値型のデータを文字列として扱いたい場面も少なくありません。たとえば、IDやコードをゼロ埋めして表示したいときや、数値データと他のテキストを結合してメッセージを作りたい場合などです。ここでは数値を文字列に変換する代表的な方法と、実務での応用例を紹介します。

4.1 CAST関数による変換

数値型(INTやDECIMALなど)を文字列型に明示的に変換するには、CAST()関数を使います。

SELECT CAST(123 AS CHAR) AS 文字列結果;
-- 結果:'123'

この方法で、数値型のカラムを文字列として他の文字列と連結することが簡単にできます。

4.2 CONVERT関数による変換

CONVERT()関数でも同様のことができます。

SELECT CONVERT(456, CHAR) AS 変換結果;
-- 結果:'456'

CAST()との違いはほとんどありませんが、標準SQLの観点からはCAST()がやや推奨されます。

4.3 演算による暗黙の変換

MySQLでは、数値と文字列をCONCAT()関数などで連結する場合、自動的に数値が文字列に変換されます。

SELECT CONCAT(2024, '年') AS 年度表示;
-- 結果:'2024年'

このような暗黙の型変換は、日常的なレポート出力やデータ整形でよく利用されます。

4.4 実務でよくある活用例

  • ゼロ埋めIDの生成
    数値型のIDを5桁で表示したい場合、LPAD()と組み合わせて使用します。
  SELECT LPAD(CAST(id AS CHAR), 5, '0') AS ゼロ埋めID
  FROM users;
  -- id=7 の場合 '00007' となる
  • 日付や金額の文字列結合
  SELECT CONCAT('合計金額は', CAST(total AS CHAR), '円です。') AS メッセージ
  FROM orders;
  -- total=1500 の場合 '合計金額は1500円です。'

4.5 注意点

数値を文字列に変換した結果は、見た目は同じでも「並び順(ソート)」や「比較演算」の挙動が変わります。
たとえば、文字列としてソートした場合、’100′ より ’20’ のほうが先に来る(辞書順)という違いがあるため、用途に応じて使い分けることが重要です。

5. 型変換を使った応用ケース

型変換は単なる数値や文字列の変換にとどまらず、実務で役立つ多様な応用が可能です。ここでは、実際によく使われる応用例と、そのポイントを紹介します。

5.1 日付系文字列の比較や変換

データベースにYYYYMMDDのような数値型または文字列型の日付が保存されている場合、単なる文字列比較だと期待通りに並びません。
この場合、CAST()で数値に変換することで、正しい日付順にソートや比較が可能になります。

SELECT *
FROM events
ORDER BY CAST(event_date AS UNSIGNED);
-- '20240501', '20240502', ... のようなデータが日付順に並ぶ

また、REPLACE()関数と組み合わせれば、'2024-05-01'のようなハイフン区切りの日付も整数に変換できます。

SELECT CAST(REPLACE('2024-05-01', '-', '') AS UNSIGNED);
-- 結果:20240501

5.2 ENUM型やコード値の並び替え

たとえばENUM型や数値として意味を持つコード値を辞書順ではなく「数値順」で並び替えたい場合、CAST()で数値型にしてからソートすると直感的な順序になります。

SELECT *
FROM products
ORDER BY CAST(product_code AS UNSIGNED);

5.3 集計やデータ整形での利用

例えば、金額がVARCHAR型で保存されている売上データを集計する場合、SUM(CAST(金額 AS SIGNED))とすることで、正確な合計値が算出できます。

SELECT SUM(CAST(売上金額 AS SIGNED)) AS 総売上
FROM sales_data;

 

5.4 精度や型の選択によるトラブル防止

特に小数や大きな数値の場合、DECIMAL型への変換で精度を保つことができます。
また、SIGNEDUNSIGNEDの使い分けも重要で、データにマイナス値が含まれるかどうかで選択を変える必要があります。

SELECT CAST('1234.567' AS DECIMAL(10, 3));
-- 結果:1234.567

5.5 エラーや不正データの検知

型変換時に意図しないNULLや0になる場合は、不正データの兆候かもしれません。
たとえば、数値に変換できない文字列が含まれている場合、CAST()で0やNULLになることがあります。
このような場合、変換結果をチェックし、エラー処理やデータクレンジングにつなげることも大切です。

SELECT original, CAST(original AS SIGNED) AS converted
FROM test_data
WHERE CAST(original AS SIGNED) = 0 AND original <> '0';
-- 数値変換できないデータだけを抽出

6. CASTとCONVERTの違い

MySQLで型変換を行う際には、主にCAST関数とCONVERT関数のどちらかを使うことになります。どちらも似たように見えますが、細かい使い分けや特徴に違いがあります。この章では、それぞれの違いと使い分けのポイントを解説します。

6.1 基本的な違い

  • CAST関数
    CAST(値 AS 型)という構文で、値を指定した型に明示的に変換します。
    標準SQLで定義されており、多くのデータベースで同じ書き方が使えます。
  SELECT CAST('123' AS SIGNED);
  • CONVERT関数
    CONVERT(値, 型)という構文で、これも値を指定した型に変換します。
    MySQLでは、データ型の変換と文字セットの変換の両方で利用できます。
  SELECT CONVERT('123', SIGNED);
  -- 型変換
  SELECT CONVERT('あいうえお' USING utf8mb4);
  -- 文字セット変換

6.2 標準SQLとの互換性

CASTはSQLの国際標準であるため、他のDB(PostgreSQL、SQL Server、Oracle等)に移植しやすいというメリットがあります。一方、CONVERTはMySQL特有の拡張や振る舞いがあり、特に文字セット変換にはCONVERT(expr USING 文字セット名)のような専用構文が用意されています。

6.3 使い分けのポイント

  • 型変換(数値・文字列・日付など)なら
    基本的にはCASTを使うのが無難です。標準SQLなので移植性も高く、将来的なデータベース移行の際も安心です。
  • 文字セットの変換(例:sjis→utf8mb4)なら
    CONVERT(expr USING 文字セット名)という形でCONVERTを使う必要があります。
  • MySQL独自機能や特殊なケース
    CONVERTの方が柔軟なこともありますが、汎用性を考えるとまずはCASTを使い、必要な場面だけCONVERTを検討すると良いでしょう。

6.4 サンプル比較

-- CASTを使った型変換(整数に変換)
SELECT CAST('456' AS SIGNED);

-- CONVERTを使った型変換
SELECT CONVERT('456', SIGNED);

-- CONVERTを使った文字セット変換
SELECT CONVERT('こんにちは' USING utf8mb4);

6.5 注意点

  • どちらも変換に失敗した場合は、NULL0が返る場合があります。
  • 文字セット変換はCASTではできません。
  • SQLモードやバージョンによって動作が異なることがあるので、開発環境と本番環境での動作検証も忘れずに。

7. 注意点・ベストプラクティス

MySQLで文字列と数値の型変換を活用する際には、思わぬ落とし穴や注意点がいくつか存在します。ここでは、トラブルを防ぎ、安全・正確に型変換を活用するためのベストプラクティスを紹介します。

7.1 無効な変換によるエラーやNULL・0の発生

型変換を行う際、変換元の値が正しい形式でなければ、意図しないNULL0が返る場合があります。

SELECT CAST('abc' AS SIGNED) AS 結果;
-- 結果:0(MySQLのデフォルト動作)

このように、数字以外の文字列を数値に変換しようとすると0になるため、元データに不正値が混在していないか事前にチェックしましょう。
また、SQLモードによってはエラーやNULLになることもあるため、本番環境の設定を確認しておくことが大切です。

7.2 精度や符号(SIGNED/UNSIGNED)の選択

  • 小数点を含むデータはDECIMAL型やFLOAT型へ変換する
  • マイナス値の可能性がある場合はSIGNED、絶対に正の整数だけの場合はUNSIGNEDを指定

用途に応じて適切な型を選択しましょう。

7.3 インデックスへの影響

WHERE句やORDER BY句で型変換(特にCASTCONVERT)を使うと、インデックスが効かなくなりパフォーマンスが低下する場合があります。

SELECT * FROM users WHERE CAST(user_id AS SIGNED) = 1000;
-- user_idにインデックスがあっても使われなくなることが多い

大量データがある場合や速度が重要な検索条件では、極力変換を使わず、元データの型を統一する設計が理想です。

7.4 暗黙の型変換に頼りすぎない

MySQLの暗黙的な型変換は便利ですが、意図しない挙動になることも多いため、大事な処理では明示的なCASTCONVERTを使うのが安全です。

SELECT '100a' + 20;
-- 結果:100('100a'の先頭数値部分だけが使われる)

思わぬバグやデータ不整合を避けるためにも、明示的な型変換を心掛けましょう。

7.5 データ入力段階での型チェック

データベース設計時に「数値は数値型」「文字列は文字列型」として保存し、可能な限り型変換の必要がない設計を目指すことも、トラブル回避の基本です。

8. まとめ

MySQLにおける「文字列と数値の型変換」は、日々のデータ処理や集計・システム運用のなかで避けて通れないテーマです。本記事では、基本から応用、注意点まで幅広く解説してきました。

文字列→数値変換にはCASTCONVERTなどの明示的な方法があり、実務では暗黙的な型変換もよく使われますが、データ品質や安全性を考慮して明示的な変換を心掛けることが大切です。また、逆に数値→文字列変換もIDやコード整形、メッセージ出力など多くの場面で活躍します。

さらに、日付型への応用、集計や並び替え、エラー検知など、型変換のテクニックは実務のさまざまな課題解決に直結します。しかし、型変換には思わぬ落とし穴やパフォーマンスへの影響もあるため、「注意点・ベストプラクティス」で挙げたポイントを押さえて運用しましょう。

型変換を正しく使いこなすことで、MySQLによるデータ操作の幅は大きく広がります。
本記事が、日々の業務や学習の一助となれば幸いです。

9. FAQ(よくある質問)

Q1. 「’abc’のような文字列を数値にCASTするとどうなりますか?」

MySQLでは、文字列を数値型(例えばSIGNEDUNSIGNED)に変換しようとした場合、変換できる数字部分が先頭にあればその値を、そうでなければ0を返します。

SELECT CAST('abc' AS SIGNED); -- 結果は0
SELECT CAST('123abc' AS SIGNED); -- 結果は123

ただし、SQLモード(たとえばSTRICT_TRANS_TABLESなど)によってはエラーやNULLになることもあります。

Q2. CASTとCONVERT、どちらを使うのが良いですか?

基本的な型変換(数値⇔文字列や日付型など)では、標準SQLに準拠しているCASTの利用が推奨されます。一方、文字セットの変換を行いたい場合は、CONVERTUSING句を使う必要があります。用途によって使い分けてください。

Q3. 暗黙の型変換だけで十分ですか?

小規模なクエリやテストでは暗黙の型変換でも動作しますが、大事な集計やシステム開発では明示的な型変換(CASTやCONVERT)を推奨します。意図しない挙動やバグを防ぐためにも、なるべく明示的に記述する習慣をつけましょう。

Q4. WHERE句やORDER BY句で型変換を使うとインデックスは効かなくなりますか?

はい。CASTCONVERTなどでカラムに型変換をかけると、そのカラムに設定したインデックスが使われなくなる場合があります。
大量データを高速に検索したい場合は、カラムの型を事前に統一しておくか、サブクエリや生成列を使って工夫しましょう。

Q5. 小数や大きな数値でも型変換は安全ですか?

DECIMALFLOAT型への変換を使うことで精度を保つことは可能です。ただし、変換時に丸め誤差が生じたり、精度の低下や桁落ちが起こることもあるため、必要な桁数を指定して変換するなどの対策が重要です。

Q6. 文字列としてソートした時と数値としてソートした時の違いは?

文字列型でソートすると、「10」より「2」が先に来る(辞書順・アルファベット順)ため、数値順に並ばせたい場合は必ず型変換を行ってからソートしましょう。