sql_mode="の役割:

6870 ワード

discuzソースコードを見てsql_を見ましたmode="",何をしているのかわからず,設定モードだと推測したが,どのモードなのかわからず,ネットで検索したところ,sql_mode="の役割:
 
----転載
sql_mode="は、MySqlモードを強制的に設定しない(例えば、入力検出、エラープロンプト、構文モードチェックなどをしない)ことでパフォーマンスが向上するはずですが、不適切なデータ(エラータイプや異常)が挿入された場合、mysqlはデータを"最良の可能性データ"に設定し、エラーを報告しないという問題があります.たとえば、/数値を:0/可能最小値/可能最大値/文字列を:空白/格納可能最大容量文字列/式を:使用可能な値(1/0-null)を返すため、解決策は、すべての列にデフォルト値を使用することです.これはパフォーマンスにも役立ちます.mysql_modeの詳細:
mysql 5でデフォルトはREAL_AS_FLOAT,PIPES_AS_CONTACT,ANSI_QUOTES,GNORE_SPACEとANSIは、このモードでは、フィールドの長さを超える値を挿入することを許可しますが、挿入後、エラーではなく警告を返します.STRICT_TRANS_TABLESの場合は、エラーになりますので、厳重な警告です.NO_AUTO_CREATE_USER
パスワードが指定されていない限り、GRANTが新しいユーザーを自動的に作成しないようにします.
以下はマニュアルのいくつかの紹介です.
サポートされているすべてのモードについて説明します.
· ALLOW_INVALID_DATES
厳格なモードでは、すべての日付をチェックしないでください.1~12の間の月と1~31の間の日のみチェックします.これは、Webアプリケーションでは、3つの異なるフィールドから年、月、日を取得し、ユーザーが挿入したコンテンツを正確に保存したい場合(日付検証を行わない)が重要です.このモードは、DATEおよびDATETIME列に適用されます.TIMESTAMP列には該当しません.TIMESTAMP列には検証日が必要です.
厳格なモードを有効にすると、サーバは1~12、1~31の範囲内だけでなく、合法的な月と日を必要とします.例えば、厳格モードを無効にする場合、’2004−04−31’は正当であるが、厳格モードを有効にすると違法である.厳格モードで固定日を隠すことを許可するには、ALLOW_を有効にする必要があります.INVALID_DATES.
· ANSI_QUOTES
「」を識別子引用符(`'引用符文字)と見なし、文字列の引用符文字と見なさないでください.ANSIモードでは、識別子を参照するために`'を使用することができます.ANSI_の有効化QUOTESの後、識別子として解釈されるため、二重引用符で文字列を参照することはできません.
· ERROR_FOR_DIVISION_BY_ZERO
厳格モードでは、INSERTまたはUPDATE中に、ゼロ除算(またはMOD(X,0))された場合、エラー(それ以外の場合は警告)が発生します.このモードが指定されていない場合、0で除算された場合、MySQLはNULLを返します.INSERT IGNOREまたはUPDATE IGNOREで使用される場合、MySQLはゼロ除算警告を生成しますが、操作結果はNULLです.
· HIGH_NOT_PRECEDENCE
NOTオペレータの優先順位は、式、例えば、NOT a BETWEEN b AND cをNOT(a BETWEEN b AND c)と解釈する.一部の旧バージョンMySQLでは、式は(NOT a)BETWEEN b AND cと解釈される.HIGH_の有効化NOT_PRECEDENCESQLモードでは、以前より高い優先度の結果を得ることができます.
mysql>SET sql_mode = ‘’;
mysql>SELECT NOT 1 BETWEEN -5 AND 5;
        -> 0
mysql>SET sql_mode = ‘broken_not’;
mysql>SELECT NOT 1 BETWEEN -5 AND 5;
        -> 1

· IGNORE_SPACE
関数名と「(」の間にスペースを許可します.すべての関数名を保存された文字として強制的に処理します.結果として、文字として保存されているデータベース、テーブルまたはカラム名にアクセスするには、それを参照する必要があります.たとえば、USER()関数があるため、mysqlデータベースのuserテーブル名とテーブル内のUser列が保存されているため、それらを参照する必要があります.
SELECT "User" FROM mysql."user";

· NO_AUTO_CREATE_USER
パスワードが指定されていない限り、GRANTが新しいユーザーを自動的に作成しないようにします.
· NO_AUTO_VALUE_ON_ZERO
NO_AUTO_VALUE_ON_ZERO影響AUTO_INCREMENT列の処理.一般に、NULLまたは0を挿入して次のシリアル番号を生成できます.NO_AUTO_VALUE_ON_ZEROは0を無効にしているので、NULLだけが次のシリアル番号を生成できます.
テーブルのAUTO_に0を保存するとINCREMENT列、このモードは便利です.(この慣例は推奨されません).たとえば、mysqldumpでテーブルをダンプして再ロードすると、MySQLが0の値に遭遇すると、一般的に新しいシリアル番号が生成され、生成されたテーブルの内容はダンプされたテーブルとは異なります.ダンプファイルを再ロードする前にNO_を有効にするAUTO_VALUE_ON_ZEROはこの問題を解決することができる.mysqldump出力にNO_を自動的に含めるAUTO_VALUE_ON_ZEROの言葉.
· NO_BACKSLASH_ESCAPES
文字列内の終了文字として、反斜線文字(')を無効にします.このモードをオンにすると、反斜線が通常の文字になります.
· NO_DIR_IN_CREATE
テーブルを作成するときは、すべてのINDEX DIRECTORYコマンドとDATA DIRECTORYコマンドを無視します.このオプションは、レプリケーション・サーバから使用できます.
· NO_ENGINE_SUBSTITUTION
必要なストレージエンジンが無効またはコンパイルされていない場合は、ストレージエンジンの自動置換を防止できます.
· NO_FIELD_OPTIONS
SHOW CREATE TABLEの出力にMySQL専用列オプションを印刷しないでください.このモードは、mysqldumpに移植可能モード(portability mode)で使用される.
· NO_KEY_OPTIONS
SHOW CREATE TABLEの出力にMySQL専用インデックスオプションを印刷しないでください.このモードは、mysqldumpに移植可能モード(portability mode)で使用される.
· NO_TABLE_OPTIONS
SHOW CREATE TABLEの出力にMySQL専用テーブルオプション(ENGINEなど)を印刷しないでください.このモードは、mysqldumpに移植可能モード(portability mode)で使用される.
· NO_UNSIGNED_SUBTRACTION
減算では、オペランドに記号がない場合は、結果をUNSIGNEDとしてマークしないでください.UNSIGNED BIGINTはコンテキストで100%使用できないことに注意してください.
· NO_ZERO_DATE
厳格なモードでは、「0000-00-00」を合法的な日付にしないでください.IGNOREオプションでゼロ日付を挿入することもできます.非厳格モードでは、日付は受け入れられますが、警告が生成されます.
· NO_ZERO_IN_DATE
厳格なモードでは、月または日の部分が0の日付は受け入れられません.IGNOREオプションを使用する場合は、類似の日付に'0000-00-00'を挿入します.非厳格モードでは、日付は受け入れられますが、警告が生成されます.
· ONLY_FULL_GROUP_BY
GROUP BYセクションのクエリが選択されていないカラムを指すようにしないでください.
· PIPES_AS_CONCAT
文字列接続オペレータ(+)(CONCAT()と同じ)とみなされ、ORとみなされません.
· REAL_AS_FLOAT
REALはDOUBLEの同義語ではなくFLOATの同義語と見なされる.
· STRICT_TRANS_TABLES
すべてのストレージエンジンの厳格なモードを有効にします.不正なデータ値が拒否されました.詳細は後述する.
· STRICT_TRANS_TABLES
トランザクション・ストレージ・エンジンの厳格モードを有効にするか、非トランザクション・ストレージ・エンジンの厳格モードを有効にすることもできます.詳細は後述する.
厳格モードは、MySQLが不正または欠落した入力値をどのように処理するかを制御します.1つの値を不正にする理由はいくつかあります.たとえば、データ型エラー、カラムに不適切、または範囲外です.新しく挿入されたローに、定義されたDEFAULT句が表示されていないカラムの値が含まれていない場合、その値は失われます.
トランザクション・テーブルの場合、STRICT_が有効になっている場合ALL_TABLESまたはSTRICT_TRANS_TABLESモードの場合、文に不正または欠落した値がある場合はエラーが発生します.文は破棄され、スクロールされます.
非トランザクション・テーブルの場合、挿入または更新された1行目に不良値が発生した場合、両方のモードの動作は同じです.文は破棄され、テーブルは変更されません.文が複数のローを挿入または変更し、2番目または2番目以降のローに悪い値が表示された場合は、どの厳格なオプションが有効になっているかによって結果が異なります.
・STRICT_についてALL_TABLES、MySQLはエラーを返し、残りのローを無視します.ただし、この場合、前の行は既に挿入または更新されている.これはあなたが一部更新できることを示しています.これはあなたが望んでいるものではないかもしれません.これを回避するには、テーブルを変更せずに破棄できるため、単行文を使用したほうがいいです.
・STRICT_についてTRANS_TABLES、MySQLは不正な値をカラムに最も近い正当な値に変換し、調整後の値を挿入します.値が失われた場合、MySQLはカラムに暗黙的なデフォルト値を挿入します.いずれの場合も、MySQLはエラーではなく警告を生成して文を実行します.暗黙的なデフォルト値について説明します.
厳格モードでは、不正な日付、例えば'2004-04-31'は許可されません.禁止日に「ゼロ」セクション、例えば「2004-04-00」または「ゼロ」日付を使用することはできません.禁止するには、厳格なパターンに基づいてNO_を有効にする必要があります.ZERO_IN_DATEとNO_ZERO_DATE SQLモード.
厳格モード(STRICT_TRANS_TABLESまたはSTRICT_ALL_TABLESモードを有効にしない)を使用しない場合、MySQLは不正または損失した値に対して調整後の値を挿入し、警告します.厳格なモードでは、INSERT IGNOREまたはUPDATE IGNOREで実現できます.
次の特殊なモードは、前に列挙したモードをすばやく組み合わせます.
これには、ほとんどの最新バージョンMySQLのすべてのモード値が含まれます.古いバージョンでは、コンビネーション・モードには、新しいバージョンにない特定のモード値は含まれません.
· ANSI
同等REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE.
· DB2
同等PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS.
· MAXDB
同等PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、 NO_AUTO_CREATE_USER.
· MSSQL
同等PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS.
· MYSQL323
同等NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE.
· MYSQL40
同等NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE.
· ORACLE
同等PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER.
· POSTGRESQL
同等PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS.
· TRADITIONAL
同等STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER