22

NULLで作成されたフィールドに MySQL で を挿入できるようになったとき、私は非常に驚きましたNOT NULL。私はいくつかの調査を行い、厳密モードを有効にする方法を発見しました。ただし、MySQLSTRICT_ALL_TABLESが有効になっているときにどのような検証が行われるかはよくわかりません。

マニュアルには次のように書かれています。

Strict モードは、MySQL が無効または欠落している入力値を処理する方法を制御します。値が無効になる理由はいくつかあります。(私の強調)たとえば、列のデータ型が間違っているか、範囲外である可能性があります。

欠けていると見なされるものと、それをどのように処理するかを理解しています。何を無効と見なすのかは不明です。いくつかのテストを行ったところ、次のことがわかりました。

  • 長すぎる文字列は無効です
  • 範囲外の数値は無効です
  • NULLNULL列の s は無効です
  • TRUE常に有効でFALSEあるように見えます (それぞれ 1 と 0 になります)
  • 無効な日付は無効です
  • ゼロの日付は有効です (この動作を変更するために追加のモードを有効にすることができます)
  • 整数フィールドの浮動小数点数は有効です (丸められます)
  • 数値フィールドの文字が無効です

MySQL は上記以外の検証チェックを行いますか?

マニュアルには「列のデータ型が間違っている」と書かれていますが、これが実際に機能する唯一の状況は、数値フィールドの文字です。データ型エラーの他の例はありますか?

MySQLが実行する正確なチェックのリストはどこかにありますか?

編集:記録のために、私のアプリケーションはすでに広範な検証を行っています。私は最後のチャンス、念のためのチェックとして厳密モードを使用しています。何かをチェックするのを忘れた場合、「黙ってデータを壊す」のではなく、すぐに失敗することを望みます。

4

2 に答える 2

9

A good resource is to check the MySQL source, and read mysql-test/t/strict.test to see all the cases they test for after setting STRICT mode or TRADITIONAL mode (which is a superset of STRICT).

You did excellent research and testing, but there are a few more cases, such as:

  • Trying to insert an undefined ENUM value.
  • Trying to insert a default value for a NOT NULL column with no DEFAULT defined.
  • Trying to use CAST() to convert strings to integers, etc.
  • Conversion of VARCHAR to MEDIUMTEXT or LONGTEXT if you give a length greater than 65536.
  • Truncation of COMMENT strings for tables and columns.
  • Conversion of string to YEAR type.
  • Defining a SET or ENUM column with duplicate entries.

Also mysql-test/include/strict_autoinc.inc, because it tests for overflow when an auto-inc value grows too large.

There are a few other test files that use STRICT mode for specific tests, but I didn't examine them.

于 2012-12-12T17:38:00.433 に答える
4

MySQL 5.5.28 (Community Server Edition) のソース コードを grep して、使用されている STRICT_ALL_TABLES のインスタンスを見つけました。

私が見たところ、あなたのリストはすでにかなり完成しているように見えますが、STRICT_ALL_TABLES の使用について私が学んだいくつかのことを以下に示します。最初のものは別の検証ですが、残りはすべてエラーと警告を扱います。

  • ジオメトリ列に既定値を設定することはできません。(sql/field.cc:9394)
  • テーブル コメントが 2048 文字を超える場合、MySQL はコメントを切り捨てて警告するのではなく、エラーを生成します。 (sql/unireg.cc:231)
  • フィールド コメントが 1024 文字を超える場合、MySQL はコメントを切り捨てて警告するのではなく、エラーを生成します。 (sql/unireg.cc:739)
  • 挿入または更新時に、重複する値が SET または ENUM に存在する場合、MySQL は警告ではなくエラーを生成します。 (sql/sql_table.cc:2503)
  • 警告だけで続行するのではなく、STRICT_ALL_TABLES の警告で中止する操作がたくさんあります。これらはリストするには多すぎます。また、abort_on_warning フラグの設定は、警告を作成するコードから離れすぎているため、すべてを簡単に文書化 (または理解) できません。しかし、誰かがソース コードに手を加えたい場合は、いくつかの場所から始めてください。sql/sql_update.cc:630sql/sql_insert.cc:841
于 2012-12-12T18:49:17.173 に答える