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 コンポーネントにカプセル化します。

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

推薦する

Amoeba を使用して MySQL データベースの読み取り/書き込み分離を実装する方法の詳細な説明

MySQL には読み取りと書き込みを分離するアーキテクチャが多数あります。Baidu のそれらのほと...

CSS コンテンツ属性を使用して、マウスホバープロンプト (ツールチップ) 効果を実現します。

なぜこのような効果を実現するのでしょうか。実は、この効果もタイトルプロンプトから派生したものですが、...

Vueは画像のドラッグと並べ替えを実装します

この記事の例では、画像のドラッグと並べ替えを実装するためのVueの具体的なコードを参考までに共有して...

Centos6.5 に zabbix2.4 をインストールするチュートリアル図

centos-DVD1バージョンシステムの固定IPアドレスは192.168.159.128で、cen...

Python3.6-MySql 挿入ファイルパス、バックスラッシュをなくす解決策

以下のように表示されます。上記のように、置き換えるだけです。 Python3.6-MySql でファ...

MySQLデッドロック問題の詳細な分析

序文私たちのビジネスがまだ初期段階にあり、同時実行の度合いが比較的低い場合、数年間はデッドロックの問...

Web ページでパラメータ名によって ActiveX コントロールのプロパティに値を割り当てる例

コードをコピーコードは次のとおりです。 <HTML> <ヘッド> <T...

ウェブデザイナーが持つべき7つのスキル

Web デザインは科学であると同時に芸術でもあります。 Web デザイン作業は、半分は適切なプログラ...

Tomcatの自動シャットダウンに関するバグ修正

序文最近、4 年間実行されている Java EE Web プロジェクトでは、システムが開けないという...

Reactでプロキシを有効にする2つの実用的な方法

プロキシを有効にする2つの方法React には、直接使用できるカプセル化された Ajax リクエスト...

Nginx のパフォーマンスを向上させるための提案

Web アプリケーションが 1 台のマシンでのみ実行される場合、パフォーマンスを向上させるのは非常に...

Tomcatサーバーのセキュリティ設定方法

Tomcat は、Java Community Process を通じて Sun が開発した、広く使...

Linux で nginx を起動および再起動する方法

Nginx (エンジン x) は、IMAP/POP3/SMTP サービスも提供する高性能 HTTP ...

5 分で vue-cli3 を使用してプロジェクトを作成する方法を説明します (初心者向けガイド)

目次1. Vue環境を構築する2. Vue スキャフォールディングツール3. プロジェクトを作成する...

ES6の新機能に関する最もよく使われる知識ポイントのまとめ

目次1. キーワード2. 脱構築3. 文字列4. 正規化5. 配列6. 機能7. オブジェクト8.シ...