MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのUNSIGNEDカラムに負の値を挿入するとどうなる?エラーの原因と挙動を解説

MySQLでは、UNSIGNED(符号なし)属性が設定されたカラムに負の値を挿入しようとすると、エラーが発生します。まずは、UNSIGNEDフィールドを持つテーブルを作成して実際に確認してみましょう。

mysql> create table UnsignedDemo
    -> (
    -> Id int UNSIGNED
    -> );
Query OK, 0 rows affected (0.79 sec)

UNSIGNEDとして宣言されたIdカラムに負の値を挿入すると、次のようなエラーが表示されます。

mysql> INSERT INTO UnsignedDemo VALUES(-100);
ERROR 1264 (22003): Out of range value for column 'Id' at row 1

なぜエラーになるのか?

UNSIGNED属性を指定した整数型カラムは、0以上の値のみを格納できます。その代わり、符号付きの通常の整数型と比べて約2倍の範囲を扱えます(例:INT UNSIGNEDの場合は0〜4294967295)。負の値は許容範囲外となるため、MySQLの厳密モード(STRICT_TRANS_TABLESなど)が有効な環境では上記の「ERROR 1264」が発生します。

なお、厳密モードが無効な場合はエラーにならず、警告とともに値が0に丸められて挿入される点にも注意が必要です。

正の値の場合の挙動

一方、UNSIGNEDカラムには正の値であれば問題なく挿入できます。以下の例では、INSERTコマンドを使って複数のレコードを登録しています。

mysql> INSERT INTO UnsignedDemo VALUES(100);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO UnsignedDemo VALUES(1000);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO UnsignedDemo VALUES(0);
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO UnsignedDemo VALUES(100000000);
Query OK, 1 row affected (0.27 sec)

SELECT文を実行して、テーブル内のすべてのレコードを確認してみましょう。

mysql> SELECT * FROM UnsignedDemo;

実行結果

+-----------+
| Id        |
+-----------+
|       100 |
|      1000 |
|         0 |
| 100000000 |
+-----------+
4 rows in set (0.00 sec)

このように、UNSIGNEDカラムには0および正の整数のみが正常に保存されます。IDやカウント値など、負の値が存在しないデータを扱う場合にUNSIGNEDは有効ですが、負の値が入りうる可能性がある列には使用しないよう設計段階で注意しましょう。

  1. MySQLで列の最大値を取得する方法をわかりやすく解説

    MySQLで特定の列の最大値を取得するには、MAX(columnName)関数を使用します。本記事では、その基本的な使い方に加えて、データベースやテーブルの設計に関する前提知識もあわせて解説します。MySQLのデータベースとテーブルの基礎MySQLをインストールする前に、まず使用するバージョンと配布形式(バイナリファイルか、ソースファイルからビルドするか)を決定することが重要です。新しく作成したばかりのデータベースには、当然ながらテーブルはまだ存在しません。データベース設計において最も重要なのは、以下の要素を決めることです。データベース全体の構造必要となるテーブルの一覧各テーブルに含まれる列(

  2. JSPのbuffer属性に「none」を設定するとどうなる?動作と指定方法を解説

    JSPのpageディレクティブにおけるbuffer属性は、サーバーが出力するレスポンスオブジェクトに対するバッファリングの動作を指定するためのものです。この属性にnoneを指定すると、バッファリングが一切行われず、サーブレットの出力は即座にレスポンスオブジェクトへ直接送られます。一方、キロバイト単位で最大バッファサイズ(例:8kb)を指定した場合は、レスポンスオブジェクトに書き出す前に、まず指定サイズのバッファへ出力を蓄えるようサーブレットに指示します。なお、buffer属性を省略した場合のデフォルト値は8kbです。buffer=noneの指定方法サーブレットの出力をバッファを介さず、直接レス