MySQLのDECIMAL(x,0)で扱える数値の範囲はどのくらい?
MySQLでは、DECIMAL型はINTEGER型やBIGINT型よりも大きな数値を扱うことができます。BIGINTの場合、最大で18446744073709551615まで格納できますが、DECIMALではDECIMAL(65,0)を指定することで、65桁すべてが「9」の巨大な数値を保存することが可能です。
DECIMAL(x,0)に必要なストレージ容量
DECIMALは数値をバイト単位で格納しており、必要なストレージ容量は次の計算式で求められます。
StorageRequirementInBytes = (x/9) + remaining; WHERE remaining = round_up( (x%9) / 2 )
DECIMAL(65,0)で格納できる最大値は以下のとおりです。
99999999999999999999999999999999999999999999999999999999999999999
実際にテーブルを作成して確認する
それでは、実際にテーブルを作成して動作を確認してみましょう。テーブル作成のクエリは次のとおりです。
mysql> create table DecimalDemo -> ( -> UserId DECIMAL(65,0) -> ); Query OK, 0 rows affected (0.62 sec)
続いて、insertコマンドを使ってレコードを挿入します。
mysql> insert into DecimalDemo values(99999999999999999999999999999999999999999999999999999999999999999); Query OK, 1 row affected (0.16 sec) mysql> insert into DecimalDemo values(99999999999999999999999999999999999999999999999999999999999999999.0); Query OK, 1 row affected (0.28 sec)
select文ですべてのレコードを表示してみます。
mysql> select *from DecimalDemo;
出力結果
+-------------------------------------------------------------------+ | UserId | +-------------------------------------------------------------------+ | 99999999999999999999999999999999999999999999999999999999999999999 | | 99999999999999999999999999999999999999999999999999999999999999999 | +-------------------------------------------------------------------+ 2 rows in set (0.00 sec)
精度に66以上を指定するとエラーになる
なお、テーブル作成時に精度として66を指定すると、以下のようなエラーが発生します。
mysql> create table DecimalDemo1 -> ( -> UserId DECIMAL(66,0) -> ); ERROR 1426 (42000): Too-big precision 66 specified for 'UserId'. Maximum is 65.
このように、DECIMAL型の精度(precision)に指定できる最大値は65です。それを超える値を指定するとエラーとなります。DECIMAL(65,0)を活用すれば、BIGINTの範囲をはるかに超える巨大な整数を正確に扱うことができるため、金額計算など高い精度が求められる場面で非常に有用です。
-
MySQLのUNHEX()に相当するPHP関数とは?hex2bin()の使い方を解説
PHPにおけるMySQLのUNHEX()相当の関数MySQLのUNHEX()関数と同じ処理をPHPで行いたい場合は、hex2bin()関数を使用します。この関数は、16進数形式の文字列をバイナリデータ(元の文字列)に変換するもので、まさにMySQLのUNHEX()に相当する機能を持っています。hex2bin()の基本構文構文は以下の通りです。$anyVariableName = hex2bin(yourHexadecimalValue);引数には16進数の文字列を指定し、戻り値として変換後のバイナリデータが返されます。PHPでの実装例実際にhex2bin()を使用したサンプルコードを見てみまし
-
MySQLのORDER BYで「カラム名 * 1」と書く目的とは?文字列型の数値を正しくソートする方法
ORDER BY カラム名 * 1 の目的MySQLでは、ORDER BY句でカラム名に「* 1」を掛けることで、そのカラムの値を数値へ暗黙的に型変換させることができます。たとえば、VARCHAR型のカラムに「301」「23」「345」といった数値のような文字列が格納されている場合、通常のORDER BYでは文字列として辞書順(文字コード順)にソートされてしまいます。しかし「* 1」を付けることで値が数値として評価され、数値の大小順に正しくソートできるようになります。基本の構文は以下のとおりです。SELECT * FROM テーブル名ORDER BY カラム名 * 1;実際に動作を確認してみよ