MySQLでdoubleやdateの値をVARCHAR型に保存しても大丈夫?型変換の方法を解説
はじめに
結論から言うと、MySQLではDOUBLE(倍精度浮動小数点数)やDATE(日付)の値をVARCHAR型のカラムに保存することが可能です。ただし、そのままでは数値計算や日付操作が行えないため、取り出す際に適切な型へ変換する必要があります。
本記事では、実際にテーブルを作成してVARCHAR型としてデータを保存し、後からDOUBLE型・DATE型へ変換して取得するまでの一連の手順を、サンプルコードと実行結果付きで解説します。
1. テーブルの作成
まず、AmountカラムとJoiningDateカラムを持つテーブルを作成します。どちらのカラムもvarchar(20)として定義しています。
mysql> create table DemoTable
-> (
-> Amount varchar(20),
-> JoiningDate varchar(20)
-> );
Query OK, 0 rows affected (0.96 sec)
2. データの挿入
次に、INSERT文を使ってレコードを挿入します。ここでは、金額を表す数値文字列と、「Oct 10,2019」のような英語形式の日付文字列をVARCHAR型として保存しています。
mysql> insert into DemoTable values('150.50','Oct 10,2019');
Query OK, 1 row affected (0.91 sec)
mysql> insert into DemoTable values('173.45','Sept 11,2018');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values('173.90','Jan 01,2017');
Query OK, 1 row affected (0.16 sec)
3. 保存したデータの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable;
実行結果は次の通りです。
+--------+--------------+
| Amount | JoiningDate |
+--------+--------------+
| 150.50 | Oct 10,2019 |
| 173.45 | Sept 11,2018 |
| 173.90 | Jan 01,2017 |
+--------+--------------+
3 rows in set (0.00 sec)
4. VARCHARからDOUBLE型・DATE型へ変換して取得
保存されたVARCHAR型の値を元の型に戻して取得するには、次のような方法があります。
- 数値の場合:「+0.0」を加算することで、MySQLが自動的にDOUBLE型として扱います。
- 日付の場合:STR_TO_DATE関数に書式指定子「%M %d,%Y」を渡すことで、英語形式の日付文字列をDATE型に変換できます。
mysql> select Amount+0.0 as DoubleValue,str_to_date(JoiningDate,'%M %d,%Y') as Date from DemoTable;
実行結果は以下のようになります。
+-------------+------------+
| DoubleValue | Date |
+-------------+------------+
| 150.5 | 2019-10-10 |
| 173.45 | 2018-09-11 |
| 173.9 | 2017-01-01 |
+-------------+------------+
3 rows in set (0.04 sec)
このように、文字列として保存された値でも、取得時に正しく数値・日付として扱えることが確認できました。
5. 補足:実務上の注意点
VARCHAR型への保存は技術的には可能ですが、実務では以下の理由から、本来のデータ型を使用することが推奨されます。
- 数値にはDECIMALまたはDOUBLEを使用:文字列として保存すると、ソートや集計時に意図しない結果になることがあります。
- 日付にはDATEまたはDATETIMEを使用:標準的な日付型なら、範囲検索や比較が高速かつ正確に行えます。
- インデックスの効率:型変換を伴うクエリはインデックスを活用できず、パフォーマンス低下につながる可能性があります。
既存システムとの互換性などの特別な事情がない限り、適切なデータ型で保存しておくのがベストプラクティスです。VARCHARでの保存はあくまで暫定的な対応策と考えましょう。
-
MySQLでSELECT *を使って現在の日付のレコードを検索する方法
現在の日付を取得するには CURDATE() 関数を使用します。さらに、STR_TO_DATE() 関数で文字列を日付型に変換し、現在の日付と比較することで、該当するレコードを抽出できます。以下に基本的な構文を示します。基本構文select *from テーブル名 where str_to_date(カラム名,書式指定子)=curdate();それでは、現在の日付が「27/10/2019」である場合を例に、具体的な手順を見ていきましょう。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable -> (
-
MySQLで文字列と数値が混在するVARCHARレコードを正しくソートする方法
はじめにVARCHAR型のカラムに「101J」や「100A」のような文字列と数値が混在したデータが格納されている場合、通常のORDER BY句では辞書順(文字コード順)にソートされるため、「103M」が「101J」より前に来るなど、意図しない順序になることがあります。このようなケースでは、ORDER BY句と「+0」による暗黙の型変換を組み合わせることで、数値部分を優先した自然な順序でソートできます。本記事では、その具体的な手順を実行例とともに解説します。1. テーブルを作成するまず、検証用のテーブルを作成します。mysql> create table DemoTable ->