MySQL で固定小数点数を扱う:DECIMAL 型 vs FLOAT 型 vs DOUBLE 型
MySQL DECIMAL 型の使い方
構文
DECIMAL 型の構文は次のとおりです。
DECIMAL(precision, scale)
precision
は、数値の桁数を指定します。scale
は、小数点以下の桁数を指定します。
例:
-- 整数部分3桁、小数点以下2桁のDECIMAL型
DECIMAL(3, 2)
-- 整数部分10桁、小数点以下4桁のDECIMAL型
DECIMAL(10, 4)
例
DECIMAL 型を使用して、商品の価格を保存する列を作成する場合、次のように記述できます。
CREATE TABLE products (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (id)
);
この例では、price
列は、整数部分10桁、小数点以下2桁のDECIMAL型として定義されています。
注意点
- DECIMAL 型は、数値の精度とスケールを厳密に制御できる一方、INT 型や FLOAT 型よりも多くのストレージスペースを必要とします。
- DECIMAL 型の値を比較するときは、精度とスケールを考慮する必要があります。
- DECIMAL 型の値を四捨五入するには、
ROUND()
関数を使用できます。
DECIMAL 型の詳細については、次のドキュメントを参照してください。
商品テーブル
CREATE TABLE products (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (id)
);
データ挿入
INSERT INTO products (name, price) VALUES
('商品1', 1234.56),
('商品2', 7890.12),
('商品3', 3456.78);
データ検索
SELECT * FROM products;
id | name | price
------- | -------- | --------
1 | 商品1 | 1234.56
2 | 商品2 | 7890.12
3 | 商品3 | 3456.78
四捨五入
SELECT ROUND(price, 1) FROM products;
結果:
price
-------
1234.6
7890.1
3456.8
比較
SELECT * FROM products WHERE price > 5000;
id | name | price
------- | -------- | --------
2 | 商品2 | 7890.12
3 | 商品3 | 3456.78
DECIMAL 型の代替方法
- ストレージスペースを多く必要とする
- 計算速度が遅い
- 比較や四捨五入などの操作が複雑
これらの欠点を克服するために、DECIMAL 型の代替方法として次の方法が考えられます。
FLOAT 型は、浮動小数点数を表すデータ型です。DECIMAL 型よりも少ないストレージスペースを必要とし、計算速度も速くなります。ただし、精度はDECIMAL 型よりも低くなります。
DOUBLE 型は、FLOAT 型よりも精度の高い浮動小数点数を表すデータ型です。DECIMAL 型と同等の精度を実現できますが、ストレージスペースはDECIMAL 型よりも多く必要になります。
INTEGER 型
小数点以下の桁数が少ない場合は、INTEGER 型を使用できます。DECIMAL 型よりもストレージスペースを少なく、計算速度も速くなります。
文字列型
数値を文字列として保存することもできます。この方法は、小数点以下の桁数が可変の場合や、数値をフォーマットする必要がある場合に便利です。
- 精度
- 速度
- ストレージスペース
- 使いやすさ
一般的には、精度と速度のバランスが取れた FLOAT 型が多くの場合で使用されます。DECIMAL 型は、高い精度が要求される場合に使用されます。
例
CREATE TABLE products (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
price FLOAT NOT NULL,
PRIMARY KEY (id)
);
mysql