mysql設定varcharフィールドのデフォルト値''とnullの違い、varcharとcharの違いについて

4253 ワード

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

(2)、mysql:
 1:  ('')       
    2: 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.” 

フィールドが空であるかどうかを示すには、Null値を格納するために追加のスペースを開く必要があり、C言語では値’が格納スペースを占有しないことがわかります.
それだけでなく、NULLを使用しないと、ツリーインデックス構造ではNULLも一般的なデータノードと見なされるため、インデックス効率が向上します.
2、nullはインデックス効率に影響する
実は私たちはmysqlを初めて勉強したとき、mysqlの提案フィールドはnullではなく、できるだけnot nullであることをお勧めします.
原話:
NULLをできるだけ避ける:NULLを保存しない限り、NOT NULLとして指定する必要があります.MySQLでは、空の値を含むカラムではクエリの最適化が困難です.インデックス、インデックスの統計、および比較演算がより複雑になるためです.空の値の代わりに0、特殊な値、または空の列を使用する必要があります.
nullはインデックスの統計に影響し、一般的にnullを同じ値にデフォルト化します.これにより、このインデックスのフィルタリング価値が低下し、オプティマイザの判断に影響します.もちろんnullが異なる値とみなされるようにパラメータを調整することもできます.
結論:つまり、デフォルト値を設定するときは、できるだけNullでデフォルト値にしないようにし、空の文字列(")を使うと良いでしょう.nullのデフォルト値はインデックス化できますが、効率に影響します.もちろん、このフィールドがインデックスを使用しないことを確認すればnullに設定することもできます.
三、統計する時、”とnullの区別
このセクションでは、MySQLのNULLとNULLの違いを参照してください.
結論:
1:   count()           ,     NULL ,         ,              。
2:   NULL  IS NULL    is not null,SQL          ifnull()       ,       =''   <>''     
3:   MySQL       ,  timestamp    ,               NULL ,            。    ,     '0000-00-00 00:00:00'
4:            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、結論
1、フィールドが短くて長いと判断した場合、charを使うとよい
2、あるフィールドを頻繁に書き換える必要がある場合は、charを使うほうがいいです(varcharは記憶するたびに追加の計算をしたり、長さを得たりするなどの作業が必要なので、非常に頻繁に変更すると、計算に多くの精力が必要になりますが、これらはcharにとっては必要ありません.)
3、varchar()の値を設計する時、頭の中でvarchar(255):mysqlを使わないでください.表の情報をメモリに入れます(最初の検索後、キャッシュしました.linuxの下は明らかですが、windowsの下にはないようです.なぜか分かりません).この時、メモリの申請は固定長さで来ます.varcharが大きいと問題があります.
4、varchar(255)とvarchar(256):mysqlの公式ドキュメントによると、varchar(255)は1バイトの記録フィールドの長さ256以上を必要とし、2バイトの記録長を必要とする.256を超えると少し無駄になります.
5、業務でinnoDBを使うことが多いので、なるべくvarchar()を使ったほうがいい
end
================================================18年5月26日更新:
フィールドを設定するときは、not nullという概念とデフォルト値が衝突しないため、フィールドをnot nullに設定できます.デフォルト値を「」に設定する場合、nullの場合は避けますが、フィールドにnullを直接割り当てる場合があり、データベースでnullが発生する場合がありますので、フィールドにnot nullを付けることを強くお勧めします.
このように:
alter table     modify `   ` VARCHAR (255) NOT NULL DEFAULT '';

=================================================18年8月8日更新
varcharフィールドのデフォルト値はnullにしないほうがいいと言われていますが、普段表を作るときはどう書きますか?特にphpmyadminでは:
1int0
2、   varchar  ,       。    ,    ,       。              ,             。