mysqlはvarcharフィールドのデフォルト値''とnullの違いを設定し、varcharとcharの違いを設定します.


一、背景
ビジネスニーズに応じて、以前の同僚がテーブルを設計していたとき、多くのフィールドにデフォルト値が設定されていなかったことがわかります.mysql 5.7バージョン以降、デフォルト値が設定されていないフィールドは、厳格なモードではエラーが発生しやすいので、各フィールドにデフォルト値を追加する必要があります.
一般的なintタイプの場合、デフォルト値は0で良いのですが、varcharタイプの場合、デフォルト値は「」に設定しますか?それともNullに設定しますか?
二、「」とnullの違い
1、占有スペースの問題
(1)、c言語:
  • '0',これは空を表し,記憶空間を消費する必要がある.
  • NULLは、この0さえないことを示します.

  • (2)、mysql:
  • Null値(’)は、スペースを占有しない
  • である.
  • MySQLのNULLは実はスペースを占有しています.公式文書の説明:
  • “NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.” 1
    フィールドが空であるかどうかを示すには、Null値を格納するために追加のスペースを開く必要があり、C言語では値’が格納スペースを占有しないことがわかります.それだけでなく、NULLを使用しないと、ツリーインデックス構造ではNULLも一般的なデータノードと見なされるため、インデックス効率が向上します.
    2、nullはインデックス効率に影響する
    実は私たちはmysqlを初めて勉強したとき、mysqlの提案フィールドはnullではなく、できるだけnot nullであることをお勧めします.原話:
    NULLをできるだけ避ける:NULLを保存しない限り、NOT NULLとして指定する必要があります.MySQLでは、空の値を含むカラムではクエリの最適化が困難です.インデックス、インデックスの統計、および比較演算がより複雑になるためです.空の値の代わりに0、特殊な値、または空の列を使用する必要があります.
    nullはインデックスの統計に影響し、一般的にnullを同じ値にデフォルト化します.これにより、このインデックスのフィルタリング価値が低下し、オプティマイザの判断に影響します.もちろんnullが異なる値とみなされるようにパラメータを調整することもできます.
    3、結論
  • デフォルト値を設定するときは、できるだけNullをデフォルト値にしないでください.フィールドがintタイプの場合、デフォルトは0、varcharタイプの場合、デフォルト値は空の文字列(’’)のほうがいいです.nullのデフォルト値はインデックス化できますが、効率に影響します.もちろん、このフィールドがインデックスを使用しないことを確認すればnullの
  • に設定することもできます.
  • フィールドを設定するときは、not nullという概念とデフォルト値が衝突しないため、フィールドをnot nullに設定できます.デフォルト値を「」に設定する場合、nullの場合は避けますが、フィールドにnullを直接割り当てる場合があり、データベースでnullが発生する場合がありますので、フィールドにnot nullを付けることを強くお勧めします.
  • alter table     modify `   ` VARCHAR (255) NOT NULL DEFAULT '';
    

    三、統計する時、”とnullの区別
    このセクションでは、MySQLのNULLとNULLの違いを参照してください.
    結論:
  • あるカラムのレコード数をcount()で集計する場合、NULL値を採用すると、自動的に無視されますが、NULL値は集計されます.
  • 判定NULLはIS NULLまたはis not nullであり、SQL文関数ではifnull()関数を用いて処理することができ、判定空文字は=’‘または<>’'で処理
  • を行うことができる.
  • MySQLの特別な注意事項について、timestampデータ型について、このデータ型に挿入された列にNULL値を挿入すると、現在のシステム時間が表示されます.空の値を挿入すると、「000 0-00-00 00 00:00」
  • が表示されます.
  • 空の値の判断はis nullを使用するか=’'を使用するかは実際の業務によって区別される.

  • 四、charとvarcharの選択について
    1、定義
    よく知られているように、charは定長であり、varcharは長くなる.
    char(M)タイプのデータ列では、各値がMバイトを占有し、ある長さがMより小さい場合、MySQLはその右側にスペース文字で補完します.(検索操作で埋めたスペース文字は削除されます)varchar(M)タイプのデータ列では、各値は、ちょうど十分なバイトのみを占有し、その長さを記録するためのバイト(すなわち、全長L+1バイト)を追加します.
    2、どちらがいいですか
    MyISAMテーブルについては、できるだけCharを使用し、常に修正が必要で断片化しやすいmyisamとisamデータテーブルについては、ディスク領域を占有するという欠点があります.
    InnoDBテーブルでは、固定長のデータ行と可変長のデータ行を区別しないデータ行がデータ行内部に格納されているため(すべてのデータ行に1つのヘッダ部分が共用されており、このヘッダ部分には各関連データ列へのポインタが格納されている)、charクラスを使用するとvarcharタイプを使用するよりも良いとは限らない.実際、charタイプは通常varcharタイプよりも多くのスペースを占有するため、スペース占有量を低減し、ディスクi/oを低減する観点からvarcharタイプを使用するのがかえって有利である.
    3、結論
  • フィールドが短くて一定長であると判断した場合、charを使用すると
  • あるフィールドで頻繁に書き換える必要がある場合、charを使うと少しよくなります(varcharは記憶するたびに追加の計算が必要で、長さなどの仕事が得られるため、非常に頻繁に変更する場合は、charにとって計算に多くの精力が必要ですが、これらはcharにとっては必要ありません.
  • varchar()値を設計するときは、頭の中でvarchar(255):mysqlを使わないでください.テーブル情報をメモリに入れます(クエリーが初めてでキャッシュされ、linuxでは明らかですが、windowsではないようで、なぜか分かりません).このときメモリの申請は固定長さで来ますが、varcharが大きいと問題があります.
  • varchar(255)とvarchar(256):mysqlの公式ドキュメントによると、varchar(255)は1バイトの記録フィールドの長さ256以上を必要とし、2バイトの記録長を必要とする.256を超えると少し無駄になります.
  • ビジネスでinnoDBを使うことが多いので、できるだけvarcharを使うほうがいい
  • です.
    投稿:https://blog.csdn.net/LJFPHP/article/details/80452686