MySQL sql_mode の変更が有効にならない理由と解決策

MySQL sql_mode の変更が有効にならない理由と解決策

序文

最近、sql_mode の話題については何度も話し合われ、関連する問題にも何度も遭遇しました。今日は、鉄は熱いうちに打て、sql_mode の別のケーススタディを皆さんと共有したいと思います。

シナリオシミュレーション

ビジネス上の機密性を考慮し、以下に含まれるテーブルとストアド プロシージャは実際のデータではありませんが、トラブルシューティング プロセスには影響しません。

(1)クライアント開発者は、標準のグループ化構文に厳密に従わないストアドプロシージャを作成しました。

セッション 1:
mysql> 区切り文字 //

mysql> プロシージャ test_for_group_by() を作成します
    -> 開始
    -> test.test から k、pad、count(*) を選択し、k でグループ化します。
    -> 終了 //
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> 区切り文字;

(2) クライアント開発者はストアドプロシージャを呼び出し、ERROR 1140を報告します。ストアドプロシージャは複雑で変更が困難であったため、クライアントはsql_modeを変更することを選択します。

セッション 1:
mysql> test_for_group_by() を呼び出します。
エラー 1140 (42000): GROUP BY のない集計クエリで、SELECT リストの式 #1 に非集計列 'test.test.k' が含まれています。これは sql_mode=only_full_group_by と互換性がありません。

(3)クライアントがsql_modeを変更して再度実行しても、ERROR 1140が報告される。

セッション2:
mysql> グローバル sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

セッション 1:
mysql> test_for_group_by() を呼び出します。
エラー 1140 (42000): GROUP BY のない集計クエリで、SELECT リストの式 #1 に非集計列 'test.test.k' が含まれています。これは sql_mode=only_full_group_by と互換性がありません。

(4)この時点で、システム変数の変更は新しい接続にのみ有効であり、既存の接続には有効ではないことに気付きました。そこで、クライアントに再接続してシステム変数が有効になっていることを確認し、ストアドプロシージャを再度呼び出すように依頼しましたが、エラーメッセージ ERROR 1140 がまだ表示されていました。何度か試してみましたが、結果は同じでした。

セッション3:
mysql> 'sql_mode' のような変数を表示します。
+---------------+------------------------------------------------------------------------------------------------------------------------------+
| 変数名 | 値 |
+---------------+------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION |
+---------------+------------------------------------------------------------------------------------------------------------------------------+
セット内の1行(0.01秒)

mysql> test_for_group_by() を呼び出します。
エラー 1140 (42000): GROUP BY のない集計クエリで、SELECT リストの式 #1 に非集計列 'test.test.k' が含まれています。これは sql_mode=only_full_group_by と互換性がありません。

(5)さらに調査を進め、クライアントにセッション内で非標準のgroup by文を実行するように依頼したところ、文は正常に実行できることが判明した。

セッション3:
mysql> select user,host,count(*) mysql.user グループから user を選択;
+---------------+-----------+----------+
| ユーザー | ホスト | カウント(*) |
+---------------+-----------+----------+
| mysql.セッション | ローカルホスト | 1 |
| mysql.sys | ローカルホスト | 1 |
| ルート | ローカルホスト | 1 |
| rpl_user | % | 1 |
| テスト | % | 1 |
+---------------+-----------+----------+
セット内の行数は 5 です (0.00 秒)

(6)調査を続けると、ストアドプロシージャのsql_modeにまだONLY_FULL_GROUP_BYが含まれているため、実行時にエラーが報告されました。

セッション2:
mysql> ルーチンから、routine_catalog、routine_schema、routine_name、routine_type、created、last_altered、sql_mode を選択します。ここで、routine_name は 'test_for_group_by' です。
+-----------------+----------------+-------------------+--------------+---------------------+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| ルーチンカタログ | ルーチンスキーマ | ルーチン名 | ルーチンタイプ | 作成済み | 最終変更日 | sql_mode |
+-----------------+----------------+-------------------+--------------+---------------------+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| def | test | test_for_group_by | 手順 | 2020-12-24 12:12:10 | 2020-12-24 12:12:10 | ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION |
+-----------------+----------------+-------------------+--------------+---------------------+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
セット内の 1 行 (0.00 秒)

(7)ここで、システム変数の変更は新しく作成されたオブジェクトにのみ有効であり、既存のオブジェクトには有効ではないこともわかります。解決策は非常に簡単で、ストアドプロシージャを再構築するだけです。

セッション3:
mysql> プロシージャ test_for_group_by を削除します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> 区切り文字 //

mysql> プロシージャ test_for_group_by() を作成します
    -> 開始
    -> test.test から k、pad、count(*) を選択し、k でグループ化します。
    -> 終了 //
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> 区切り文字;

mysql> test_for_group_by() を呼び出します。
+--------+-------------------------------------------------------------+----------+
| k | パッド | カウント(*) |
+--------+-------------------------------------------------------------+----------+
| 393975 | 35227182905-15234265621-59793845249-15413569710-23749555118 | 1 |
| 495688 | 09512147864-77936258834-40901700703-13541171421-15205431759 | 1 |
| 497896 | 13152283289-69561545685-52868757241-04245213425-69280254356 | 1 |
| 498573 | 43131080328-59298106536-35954612339-97546855884-75769514803 | 1 |
| 500775 | 27590239742-20204899609-34345212327-79811525340-24267764271 | 1 |
| 501885 | 63188288836-92351140030-06390587585-66802097351-49282961843 | 1 |
| 503330 | 01495266405-82925129145-92643983850-90243995398-18709399387 | 1 |
| 503666 | 40929980986-33813039690-13155419391-97985458477-39771362212 | 1 |
| 504353 | 00505722282-72931248925-57037623248-81117963809-88658076981 | 1 |
| 514246 | 21979564480-87492594656-60524686334-78820761788-57684966682 | 1 |
+--------+-------------------------------------------------------------+----------+
セット内の行数は 10 です (0.00 秒)

クエリは正常、影響を受けた行は 0 行 (0.00 秒)

要約する

この事例から、sql_mode システム変数の変更は、新しく作成された接続と新しく作成されたオブジェクト (主に関数とストアド プロシージャを含む) に対してのみ有効であり、既存の接続と既存のオブジェクトに対しては有効ではないことがわかります。

上記は、MySQL sql_mode の変更が有効にならない理由と解決策の詳細な内容です。MySQL sql_mode の変更が有効にならないことの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL sql_modeクエリと設定の詳細な説明
  • MySQL での SQL モードの表示と設定の詳細な説明
  • MySQL の sql_mode モード例の詳細な説明
  • Django2 は MySQL に接続し、モデルテストの例を分析します。
  • MySQL sql_modeの適切な設定に関する詳細な説明
  • MySQL sql_mode の分析と設定の説明
  • MySQL 5.7 の sql_mode のデフォルト値によって生じる落とし穴と解決策
  • MySql バージョンの問題に対する完璧なソリューション sql_mode=only_full_group_by
  • MySQL 5.7.9 バージョンの sql_mode=only_full_group_by 問題を解決する
  • MySQL での SQL モードの使用法の詳細な説明
  • mysql sql_mode="" 関数の説明
  • MySQL sql_mode の使用に関する詳細な説明

<<:  CSS に基づいて MaterialUI ボタン​​クリックアニメーションを実装し、それを React コンポーネントにカプセル化します。

>>:  ウェブページのテーブルの境界線を設定する方法

推薦する

アイデアを使用して Springboot 初期化サーバーを構築する際の問題分析

問題の説明最近、Springbootプロジェクトを構築していたところ、会社のネットワークケーブルに接...

jsは、州、市、地区の3レベルのリンクの非選択ドロップダウンボックスバージョンを実現します。

インターネットで3レベルリンクを検索したところ、すべてオプションで書かれていました。突然、別の方法で...

純粋な CSS3 でモバイルの拡大と縮小の効果を実装するためのサンプル コード

この記事では、純粋な CSS3 を使用してモバイル端末での展開と折りたたみの効果を実装するサンプルコ...

VmWareでcentos7をインストールするときにインターネットにアクセスできない問題の解決策

Centos7 のインストール時に VmWare がインターネットにアクセスできない場合はどうすれば...

Axiosは繰り返しのリクエストをキャンセル

目次序文1. リクエストをキャンセルする方法2. 重複リクエストの判定方法3. 繰り返しリクエストを...

ElasticSearch と ElasticSearch-Head の Docker デプロイメントの実装

この記事では主にDockerを使ってElasticSearch:バージョン6.8.4をデプロイする方...

Linux で JDK 環境を構成する方法

1. 公式ウェブサイトにアクセスして、jdk-8u162-linux-x64.tar.gzなどのLi...

Linux CentOS6.5 yum インストール mysql5.6

この記事では、Linux yumを使用してmysql5.6をインストールする簡単な手順を参考までに紹...

いくつかの重要なMySQL変数

MySQL 変数は数多くありますが、その中には注目に値するものもあります。ここでは、参考までに、注目...

WeChatアプレットは記録機能を実装します

この記事では、WeChatアプレットのレコード機能を実装するための具体的なコードを参考までに紹介しま...

Keras を使って SQL インジェクション攻撃を判断する (例の説明)

この記事では、ディープラーニングフレームワーク keras を使用して、SQL インジェクションの特...

Vue モバイル開発で better-scroll を使用するときにクリック イベントが失敗する問題の解決策

最近、モバイル プロジェクトの開発方法を学ぶために vue を使用し、スクロールには better-...

PIP で docker-compose をインストールする際のタイムアウト問題の解決方法

1: インストールコマンドpip install docker-compose例外情報socket....

VueはAmapを使用して都市の位置特定を実現

この記事では、Amapを使用して都市の位置特定を実現するVueの具体的なコードを参考までに共有します...

CSS3を使用してオンラインライブ放送に似たキューアニメーションを実装する方法

以前、グループの友人が質問しました。つまり、ミニプログラムでユーザーがオンラインになったときに、ライ...