今回は、SQLの通貨型MONEY
とSMALLMONEY
について説明します。
標準SQLにおいては、金額のデータ型は数値型を使うことが一般的です。金額が整数であればINT
、より精緻な金額を扱うならDECIMAL
がよく使われる数値型でしょう。
一方、SQLには通貨型としてMONEY
やSMALLMONEY
も存在しています。
この記事ではMONEY
とSMALLMONEY
の概要と使い所について考えてみます。
通貨型とは
この章では、SQLで使われる通貨型MONEY
とSMALLMONEY
について、概略します。
MONEYとSMALLMONEY
MONEY
とSMALLMONEY
は、金額または通貨を表す際に使われるデータ型です。どちらも小数点以下4桁まで表現します。
また、SQL SERVER公式ページに記載されていますが、「ピリオド」を使って小数点以下を区切ることにより、ドルとセントを分離することが可能です。
たとえば、2.15という表記は2ドル15セントを意味します。
SQL SERVER公式〜MONEYとSMALLMONEY
SQL非標準のデータ型
MONEY
、SMALLMONEY
はSQL標準ではなく、特定のデータベースシステム特有の型のため、異なるデータベースシステム間での移行や互換性に問題が生じる可能性があります。
つまり、 すべてのRBDMSで金額を取り扱う場合の標準的なデータ型ではありません。一般的に、金額が整数であればINT
、より精緻な金額であれば、後述するDECIMAL
が使われます。
通貨型が存在するRDBMS
通貨型MONEY
とSMALLMONEY
は、SQL標準のデータ型ではないため、サポートされているRDBMSも限定的です。この章では、通貨型がサポートされている代表的なRDBMSであるSQL SERVERとPostgreSQLについて、紹介します。
SQL SERVER
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
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
この章では、SQL SERVERを例にMONEY
やSMALLMONEY
の使い所について考えてみます。
直感的な金額表記
MONEY
やSMALLMONEY
は、その名称から金額用のデータであることが直感的に分かります。また、小数点以下の精度もデフォルトでサポートされていますので、データベース設計の工程が簡素化されます。
そのため、通常、DECIMAL
が使われるような精緻な金額を扱う場合には、MONEY
を選択するだけで、要件を満たし直感的にも分かりやすいデータベース設計になるでしょう。
また、データベースから取得した金額データは、アプリケーションレベルの調整で、ユーザーにとって理解しやすい通貨記号で表示することができます。
簡潔なコード
MONEY
やSMALLMONEY
型を使うことで、金額に関連するコードをより簡潔に記述できます。特に、DECIMAL
型を使用する際に必要となる桁数や小数点以下の精度を事前に指定する手間が不要です。
これは、金額を扱う多くの場面でコード記述の簡素化につながります。
DECIMAL
型では、金額の精度を保証するために桁数を明示的に指定する必要があります。これは、特に金額の範囲が事前に不確定な場合に、適切な桁数や精度を選択する上で複雑化する場合があります。
一方で、MONEY
型を使用する場合、小数点以下4桁の精度がデフォルトで設定されており、金額計算に最適化されているため、追加の設定なしで直接金額を扱うことができます。
SQL標準のDECIMAL
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章データ型