[SQL] TINYINT(1)は、3桁の整数でも保存できる件

はじめに

職場でSQLのテーブルを実装していて、TINYINT(1)の扱いの間違いを知ったので、共有します。
TINYINT(1)は「保存可能桁数=1」ではないので注意して下さい。

よく見かける「TINYINT(1)」

主に、真偽値などを格納する際に、使われる表現かと思います。
文字通り、Tiny(小さな)、Integer(整数)のことです。
私はこれを、1桁だけ保存する…という意味かと、間違えて使っていました。

表示可能桁数を指定している

この(1)という表現、実は表示可能桁数を表しているそうです。

SQLの規定で、TINYINTは「-128~+127」の値が保存でき、桁数で言うと4桁の値が保存できます。

注意が必要なのは、表示桁数を1に指定した場合、2桁以上の表示はできないですが、確保されているストレージのサイズや、保存可能範囲は変わらないことです。

各整数型の保存可能範囲

以下、分かりやすくまとめてくれているサイトがあったので、参考にさせてもらいました。
参考元は、この記事の最後にまとめております。

TINYINT

  • 保存可能桁数:4
  • 符号付きの時の範囲:-128 ~ 127
  • 符号なしの時の範囲: 0 ~ 255

SMALLINT

  • 保存可能桁数:6
  • 符号付きの時の範囲: -32,768 ~ 32,767
  • 符号なしの時の範囲: 0 ~ 65,535

MEDIUMINT

  • 保存可能桁数:9
  • 符号付きの時の範囲:-8,388,608 ~ 8,388,607
  • 符号なしの時の範囲: 0 ~ 16,777,215

INT

  • 保存可能桁数:11
  • 符号付きの時の範囲:-2,147,483,648 ~ 2,147,483,647
  • 符号なしの時の範囲: 0 ~ 4,294,967,295

    ※ 「INTEGER」は「INT」と同じです。

BIGINT

  • 保存可能桁数:20
  • 符号付きの時の範囲:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  • 符号なしの時の範囲: 0 ~ 18,446,744,073,709,551,615

さいごに

今日は、自分自身が間違えて飲み込んでいたことを、戒めもかねて共有させて頂きました。
潜在的なエラーを生む可能性もありますので、みなさんもお気をつけて。

最後までありがとうございました。

参考サイト

https://blog.s-giken.net/367.html
https://dev.mysql.com/doc/refman/5.6/ja/integer-types.html
https://ameblo.jp/ill-grasper/entry-11133618614.html

PON3

PON3

5年くらい前に、30代完全未経験から独学でWeb系のソフトウェアエンジニアになった人。 現在はフリーランスエンジニアとして、大阪の自宅からフルリモートで東京の自社開発企業のお仕事をしている。 主戦場はバックエンドで、Go言語でのAPI開発や、Pythonでのデータ分析が武器。 とは言いつつ、フロントエンドをSPAを実装したり、IaCでクラウドインフラの設計構築したり、スクラム開発でプロジェクト運営したりするなんでも屋。 いつも、ググってきては誰かが書いてくれた記事を見て開発していたが、もらってばかりでなく世の中に返すこともしたいと思い、技術ブログをはじめる。 妻と2歳になる娘の3人暮らし。 何かご用件がある方は、TwitterのDMからどうぞ。