8

私は最近、SQLのエキサイティングな世界を掘り下げました。私はまだ概念に頭を悩ませようとしています。私はオンラインでチュートリアルをフォローしています。これらのチュートリアルの多くには、このようなテーブルを作成するためのSQLが含まれています。

CREATE TABLE `users` (
     `id` tinyint(4) NOT NULL AUTO_INCREMENT,
     `username` varchar(10) NOT NULL,
     `password` varchar(100) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

のような行を見た後id tinyint(4)、パラメータがデータ型に渡されるのか疑問に思いました。「つまり、idは-128から127までの任意の整数(4文字以内)にすることができますか?」と思いました。

だから私はドキュメントを調べました。これは、MySQLドキュメントが数値タイプ属性について言わなければならないことです

表示幅は、列に格納できる値の範囲を制限しません。また、列の表示幅よりも広い値が正しく表示されるのを妨げることもありません。たとえば、SMALLINT(3)として指定された列の通常のSMALLINT範囲は-32768〜32767であり、3桁で許可されている範囲外の値は、3桁を超える値を使用して完全に表示されます。

オプションの(非標準)属性ZEROFILLと組み合わせて使用​​すると、スペースのデフォルトのパディングはゼロに置き換えられます。たとえば、INT(4)ZEROFILLとして宣言された列の場合、値5は0005として取得されます。

したがって、私がこの権利を読んでいる場合、INT(255)ゼロフィルを使用していない限り、のようなことを宣言することは無意味です。データベースがそのデータベースに十分なスペースを割り当てるデータ型を宣言するのは理にかなっています。

では、なぜ人々はこのようなコードを書くのでしょうか?それは目的を果たしますか?私は完全に誤解していますか?

4

1 に答える 1

17

CHARisのような他の列タイプでは長さを指定するため、この追加の「機能」表示幅は非常に混乱します。

ここに短い内訳があります:

  • 最も重要なのは、「ストレージスペース」や「桁数」を指定していないことです。この列のデータが返される前にどのようにフォーマットされているかを示しているだけです。INT(5)は、INT(16)やINT(255)のような同じ値を格納できます。3つすべてが、INTに有効なすべての(そして唯一の)値を格納できます。INT(255)は、255桁の数値を格納できません。それらすべてのストレージスペースは、INTが占めるスペースです。
  • 表示幅のある列で使用ZEROFILLし、格納されている数値の文字列表現が表示幅よりも短い場合は、ゼロが左に埋め込まれます。それより長い場合は、何も起こりません。INT(5)を選択し、値が13の場合、00013として返されます。値が123456の場合、123456として返されます。
  • を使用しない場合ZEROFILL、パディングはまったくありません(スペースなどはありません)
  • を使用する場合はZEROFILL、列も次のようになることに注意する必要がありますUNSIGNED
  • いずれの場合も、テーブルのメタデータが照会されると、表示幅が返されます。したがって、アプリケーションはデータのフォーマット方法を知ることができます。

ストレージレイヤーが保存されたデータの視覚的表現を「認識」しているため、表示幅が嫌いです。これ以外に、私が知っている用途はありません。

于 2013-01-23T23:24:29.880 に答える