Mysql SQLサーバーモードの紹介
6039 ワード
mysql SQLサーバモード
MySQLサーバは、異なるSQLモードで動作し、異なるクライアントに異なるモードを適用できます.これにより、各アプリケーションは、自分のニーズに応じてサーバの操作モードをカスタマイズできます.
スキーマは、MySQLがサポートすべきSQL構文と、どのデータ検証チェックを実行するかを定義します.これにより、異なる環境でMySQLを使用しやすくなり、他のデータベース・サーバと組み合わせてMySQLを使用できます.
デフォルトのSQLモードを設定するには、--sql-mode=「modes」オプションを使用してmysqldを起動します.リセットしたい場合は、この値を空にすることもできます(--sql-mode=").
また、起動後にSET[SESSION|GLOBAL]sql_を使用することもできます.mode='modes'文設定sql_mode変数を使用してSQLモードを変更します.GLOBAL変数を設定するにはSUPER権限が必要で、それ以降接続されているすべてのクライアントの操作に影響します.SESSION変数の設定は、現在のクライアントにのみ影響します.任意のクライアントは、いつでも自分のセッションsqlを変更できます.mode値.
Modesisは、カンマ(',')で区切られた一連の異なるモードです.SELECT@@sql_mode文は現在のモードをクエリーします.デフォルトは空です(モードは設定されていません).
主要重要sql_mode値
・ANSI
標準SQLに適合するように、構文と動作を変更します.
・STRICT_TRANS_TABLES
指定した値をトランザクション・テーブルに挿入できない場合は、文を破棄します.非トランザクション・テーブルの場合、値が1行または複数行の文の1行目に表示された場合、文は破棄されます.このセクションでは、より詳細に説明します.
・TRADITIONAL
Make MySQLの動作は、「従来の」SQLデータベースシステムのようなものです.このモードの簡単な説明は、列に不正な値を挿入した場合に「警告ではなくエラーを与える」ことです.注記:エラーが検出されるとすぐにINSERT/UPDATEを破棄します.非トランザクション・ストレージ・エンジンを使用する場合は、エラーが発生する前に行われたデータの変更が「スクロール」されないため、「一部のみ行われた」と更新されます.
本マニュアルは「厳格モード」を指し、少なくともSTRICT_TRANS_TABLESまたはSTRICT_ALL_TABLESが有効になっているモード.
サポートされているすべてのモードについて説明します.
・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))、エラーが発生する(それ以外は警告).このモードが与えられていない場合、ゼロで除かれた場合、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モードを有効にすると、従来のより上位レベルの結果が得られる.
・IGNORE_SPACE
関数名と'('の間にスペースを許可します.すべての関数名を保存された文字として強制的に使用します.結果として、文字として保存されているデータベース、テーブルまたはカラム名にアクセスするには、それを参照する必要があります.たとえば、USER()関数があるため、mysqlデータベースのuserテーブル名とテーブル内の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_INCREMENT列に0を保存すると便利です.(この慣例は推奨されません)たとえば、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専用カラムオプションを印刷しないでください.このモードはマイグレーション可能モード(portability mode)でmysqldumpに使用されます.
・NO_KEY_OPTIONS
SHOW CREATE TABLEの出力にMySQL専用インデックスオプションを印刷しないでください.このモードはマイグレーション可能モード(portability mode)でmysqldumpに使用されます.
・NO_TABLE_OPTIONS
SHOW CREATE TABLEの出力にMySQL専用テーブルオプション(ENGINEなど)を印刷しないでください.このモードは移植可能モード(portability mode)でmysqldumpに使用されます.
・NO_UNSIGNED_SUBTRACTION
減算では、オペランドに記号がない場合は、結果をUNSIGNEDとしてマークしないでください.UNSIGNED BIGINTをコンテキストで100%使用できないように注意してください.12.8節、「Cast関数とオペレータ」を参照してください.
・NO_ZERO_DATE
厳格モードでは、「000-00-00」を正当な日付としないでください.IGNOREオプションでゼロ日付を挿入できます.非厳格モードでは、日付を受け入れることができますが、警告が生成されます.
・NO_ZERO_IN_DATE
厳格モードでは、月または日の部分が0の日付は受け入れられません.IGNOREオプションを使用する場合は、類似の日付に'000-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行目以降の行に悪い値が表示された場合、どの厳格なオプションが有効になっているかによって結果が異なります.
・STRICT_ALL_TABLESの場合、MySQLはエラーを返し、残りの行を無視します.ただし、この場合、前の行は挿入または更新されています.これは、一部更新できることを示しています.これはあなたが望んでいるものではないかもしれません.この点を避けるには、表を変更せずに放棄できるため、単行文を使用したほうがいいです.
・STRICT_TRANS_TABLESの場合、MySQLは不正な値をその列に最も近い正当な値に変換し、調整された値を挿入します.値が失われた場合、MySQLは列に暗黙的なデフォルト値を挿入します.いずれの場合も、MySQLはエラーではなく警告を生成して文を実行し続けます.13.1.5節では、「CREATE TABLE構文」に暗黙的なデフォルト値が記載されています.
厳格モードでは、'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で実現できます.13.5.4.22節、「SHOW WARNINGS構文」を参照してください.
MySQLサーバは、異なるSQLモードで動作し、異なるクライアントに異なるモードを適用できます.これにより、各アプリケーションは、自分のニーズに応じてサーバの操作モードをカスタマイズできます.
スキーマは、MySQLがサポートすべきSQL構文と、どのデータ検証チェックを実行するかを定義します.これにより、異なる環境でMySQLを使用しやすくなり、他のデータベース・サーバと組み合わせてMySQLを使用できます.
デフォルトのSQLモードを設定するには、--sql-mode=「modes」オプションを使用してmysqldを起動します.リセットしたい場合は、この値を空にすることもできます(--sql-mode=").
また、起動後にSET[SESSION|GLOBAL]sql_を使用することもできます.mode='modes'文設定sql_mode変数を使用してSQLモードを変更します.GLOBAL変数を設定するにはSUPER権限が必要で、それ以降接続されているすべてのクライアントの操作に影響します.SESSION変数の設定は、現在のクライアントにのみ影響します.任意のクライアントは、いつでも自分のセッションsqlを変更できます.mode値.
Modesisは、カンマ(',')で区切られた一連の異なるモードです.SELECT@@sql_mode文は現在のモードをクエリーします.デフォルトは空です(モードは設定されていません).
主要重要sql_mode値
・ANSI
標準SQLに適合するように、構文と動作を変更します.
・STRICT_TRANS_TABLES
指定した値をトランザクション・テーブルに挿入できない場合は、文を破棄します.非トランザクション・テーブルの場合、値が1行または複数行の文の1行目に表示された場合、文は破棄されます.このセクションでは、より詳細に説明します.
・TRADITIONAL
Make MySQLの動作は、「従来の」SQLデータベースシステムのようなものです.このモードの簡単な説明は、列に不正な値を挿入した場合に「警告ではなくエラーを与える」ことです.注記:エラーが検出されるとすぐにINSERT/UPDATEを破棄します.非トランザクション・ストレージ・エンジンを使用する場合は、エラーが発生する前に行われたデータの変更が「スクロール」されないため、「一部のみ行われた」と更新されます.
本マニュアルは「厳格モード」を指し、少なくともSTRICT_TRANS_TABLESまたはSTRICT_ALL_TABLESが有効になっているモード.
サポートされているすべてのモードについて説明します.
・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))、エラーが発生する(それ以外は警告).このモードが与えられていない場合、ゼロで除かれた場合、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_INCREMENT列に0を保存すると便利です.(この慣例は推奨されません)たとえば、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専用カラムオプションを印刷しないでください.このモードはマイグレーション可能モード(portability mode)でmysqldumpに使用されます.
・NO_KEY_OPTIONS
SHOW CREATE TABLEの出力にMySQL専用インデックスオプションを印刷しないでください.このモードはマイグレーション可能モード(portability mode)でmysqldumpに使用されます.
・NO_TABLE_OPTIONS
SHOW CREATE TABLEの出力にMySQL専用テーブルオプション(ENGINEなど)を印刷しないでください.このモードは移植可能モード(portability mode)でmysqldumpに使用されます.
・NO_UNSIGNED_SUBTRACTION
減算では、オペランドに記号がない場合は、結果をUNSIGNEDとしてマークしないでください.UNSIGNED BIGINTをコンテキストで100%使用できないように注意してください.12.8節、「Cast関数とオペレータ」を参照してください.
・NO_ZERO_DATE
厳格モードでは、「000-00-00」を正当な日付としないでください.IGNOREオプションでゼロ日付を挿入できます.非厳格モードでは、日付を受け入れることができますが、警告が生成されます.
・NO_ZERO_IN_DATE
厳格モードでは、月または日の部分が0の日付は受け入れられません.IGNOREオプションを使用する場合は、類似の日付に'000-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行目以降の行に悪い値が表示された場合、どの厳格なオプションが有効になっているかによって結果が異なります.
・STRICT_ALL_TABLESの場合、MySQLはエラーを返し、残りの行を無視します.ただし、この場合、前の行は挿入または更新されています.これは、一部更新できることを示しています.これはあなたが望んでいるものではないかもしれません.この点を避けるには、表を変更せずに放棄できるため、単行文を使用したほうがいいです.
・STRICT_TRANS_TABLESの場合、MySQLは不正な値をその列に最も近い正当な値に変換し、調整された値を挿入します.値が失われた場合、MySQLは列に暗黙的なデフォルト値を挿入します.いずれの場合も、MySQLはエラーではなく警告を生成して文を実行し続けます.13.1.5節では、「CREATE TABLE構文」に暗黙的なデフォルト値が記載されています.
厳格モードでは、'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で実現できます.13.5.4.22節、「SHOW WARNINGS構文」を参照してください.