今回は、SQLの通貨型MONEYとSMALLMONEYについて説明します。
標準SQLにおいては、金額のデータ型は数値型を使うことが一般的です。金額が整数であればINT、より精緻な金額を扱うならDECIMALがよく使われる数値型でしょう。
一方、SQLには通貨型としてMONEYやSMALLMONEYも存在しています。
この記事ではMONEYとSMALLMONEYの概要と使い所について考えてみます。
この章では、SQLで使われる通貨型MONEYとSMALLMONEYについて、概略します。
MONEYとSMALLMONEYは、金額または通貨を表す際に使われるデータ型です。どちらも小数点以下4桁まで表現します。
また、SQL SERVER公式ページに記載されていますが、「ピリオド」を使って小数点以下を区切ることにより、ドルとセントを分離することが可能です。
たとえば、2.15という表記は2ドル15セントを意味します。
SQL SERVER公式〜MONEYとSMALLMONEY
MONEY、SMALLMONEYはSQL標準ではなく、特定のデータベースシステム特有の型のため、異なるデータベースシステム間での移行や互換性に問題が生じる可能性があります。
つまり、 すべてのRBDMSで金額を取り扱う場合の標準的なデータ型ではありません。一般的に、金額が整数であればINT、より精緻な金額であれば、後述するDECIMALが使われます。
通貨型MONEYとSMALLMONEYは、SQL標準のデータ型ではないため、サポートされているRDBMSも限定的です。この章では、通貨型がサポートされている代表的なRDBMSであるSQL SERVERとPostgreSQLについて、紹介します。
SQL Serverでは、通貨型のMONEYとSMALLMONEYがサポートされています。MONEYとSMALLMONEYは文字通り、金額の格納と計算に特化しており、小数点以下4桁の精度を持っています。この通貨型を使うことで正確な金融計算が可能となります。
MONEY型は広範な金額をカバーできる一方で、SMALLMONEY型はより小さな範囲の金額に適しており、その使用はデータベースの要件に応じて選択する必要があります。
| データ型名 | 内容 |
|---|---|
| MONEY | -922,337,203,685,477.5808 から 922,337,203,685,477.5807 |
| SMALLMONEY | -214,748.3648 から 214,748.3647 |
なお、SQL ServerではMONEYやSMALLMONEYで金額を格納する際、通貨記号も使うことができますが、データベースは通貨記号を無視して数値のみを格納します。
通貨記号は、表示やレポート作成の際にアプリケーションレベルで処理されているようです。
SQL SERVER公式〜MONEYとSMALLMONEY
PostgreSQLでもMONEY型が利用可能で、SQL SERVERと同じく金額データの格納に使用されます。
PostgreSQLにおけるMONEY型は、金額を表現する際に通貨記号と小数点以下の桁数を有しており、地域設定に基づいた金額のフォーマットが可能です。
| データ型名 | 内容 |
|---|---|
| MONEY | -92,233,720,368,547,758.08 から +92,233,720,368,547,758.07 |
ただし、SMALLMONEY型はSQL Server特有のものであり、PostgreSQLでは同等の数値型は提供されていません。
PostgreSQL公式〜第8章データ型
この章では、SQL SERVERを例にMONEYやSMALLMONEYの使い所について考えてみます。
MONEYやSMALLMONEYは、その名称から金額用のデータであることが直感的に分かります。また、小数点以下の精度もデフォルトでサポートされていますので、データベース設計の工程が簡素化されます。
そのため、通常、DECIMALが使われるような精緻な金額を扱う場合には、MONEYを選択するだけで、要件を満たし直感的にも分かりやすいデータベース設計になるでしょう。
また、データベースから取得した金額データは、アプリケーションレベルの調整で、ユーザーにとって理解しやすい通貨記号で表示することができます。
MONEYやSMALLMONEY型を使うことで、金額に関連するコードをより簡潔に記述できます。特に、DECIMAL型を使用する際に必要となる桁数や小数点以下の精度を事前に指定する手間が不要です。
これは、金額を扱う多くの場面でコード記述の簡素化につながります。
DECIMAL型では、金額の精度を保証するために桁数を明示的に指定する必要があります。これは、特に金額の範囲が事前に不確定な場合に、適切な桁数や精度を選択する上で複雑化する場合があります。
一方で、MONEY型を使用する場合、小数点以下4桁の精度がデフォルトで設定されており、金額計算に最適化されているため、追加の設定なしで直接金額を扱うことができます。
MONEY型は通貨型に特化し、金額計算の正確性と直感的な表記を実現しますが、データベース設計やアプリケーション開発においては、より汎用性の高いDECIMAL型を選択することも有効な選択肢です。
DECIMAL型はSQL標準に準拠しており、多くのRDBMSで広くサポートされている数値型です。
DECIMAL型の大きな利点は、その精度の高さにあります。桁数(全体の桁数)とスケール(小数点以下の桁数)を指定することで、必要な精度で金額を表現することが可能です。
そのため、DECIMAL型は金融データや精度が要求される数値データを扱うケースに汎用的に適しています。
今回は、SQLで存在しているMONEYとSMALLMONEYについて記事にしました。
本文で説明したように、MONEYとSMALLMONEYは標準SQLではなく、一部のRDBMSの環境に依存しているデータ型です。同じような機能として、DECIMALが標準SQLで使えますので、あえて使う必要性はないのかもしれません。
一方で、通貨特化型のデータ型のため、デフォルトで必要な機能性が提供されることや通貨単位もサポートされることは、利点と言えるでしょう。
利用を検討する場合には、SQL SERVERやPostgreSQLの公式ページで詳細を調べてみましょう。
SQL SERVER公式〜MONEYとSMALLMONEY
PostgreSQL公式〜第8章データ型