開発環境はmysql5.6
に接続されており、テスト環境はmysql5.7
です。開発中に、友人がgroup by
に関するsql
ステートメントを書きました。開発環境では正常に動作しますが、テスト環境では例外が発生します。
原因分析:MySQL5.7
バージョンには、デフォルトでmysql sql_mode =only_full_group_by
属性が設定されているため、エラーが発生します。
ONLY_FULL_GROUP_BY
がこのエラーの原因です。この厳密モードでは、group by
集計操作の場合、select## の場合、列が
#group byに現れない場合、この
SQLは不正です。開発者が作成した
sqlでは、
select列が
group by句に含まれていないため、
group を使用するとエラーが報告されます。による###。テスト環境は、
の最新バージョンをダウンロードしてインストールしました。only_full_group_by
モードはデフォルトで有効になっています。
SELECT` `@@sql_mode;
##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
2. ONLY_FULL_GROUP_BY を削除し、値をリセットします。
SET` `@@``global``.sql_mode =``'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'``;
既存のデータベースの場合は、対応するデータの下で実行する必要があります
SET` `sql_mode =``'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'``;
上記のメソッドは mysql データベースを再起動した後も無効であり、次のメソッドは依然として無効です再起動後に有効になります
linux
システムの/etc/my.cnfファイルで
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
注意すべき点は、このキーワードを
に追加する必要があることです。 [mysqld] 構成、次のように追加後、
mysqlを再起動して有効にします。データベースを終了します: exit、再起動コマンド:
service mysqld restart #lnmp重启mysql lnmp restart mysql
ページとエラー メッセージを更新します消えます。正常に解決されました。データベースに再度接続して、
sql_mode Configuration
select @@sql_mode:
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
以降のバージョンに関するこの記事は終了です。これで、
Mysql5 .7
ONLY_FULL_GROUP_BYこの記事では、エラー解決策と、より関連のある
Mysql5 について紹介します。 7 ONLY_FULL_GROUP_BY## は次のとおりです。 sql_mode の共通値の意味については、次を参照してください。
ONLY_FULL_GROUP_BY: GROUP BY 集計操作の場合、 SELECT の列が GROUP BY に現れない場合、列が GROUP BY 句にないため、この SQL は無効です。NO_AUTO_VALUE_ON_ZERO: この値は、自動拡張列の挿入に影響します。デフォルト設定では、0 または NULL を挿入すると、次の自動増加値が生成されます。このオプションは、ユーザーが値 0 を挿入する必要があり、列が自動増加する場合に便利です。
STRICT_TRANS_TABLES: このモードでは、トランザクション テーブルに値を挿入できない場合、現在の操作は中断され、非トランザクション テーブルには制限がありません。厳密モードでは、ゼロの日付と月は許可されません
NO_ZERO_DATE: この値を設定すると、mysql データベースではゼロの日付の挿入が許可されず、ゼロの日付を挿入すると警告ではなくエラーがスローされます。
ERROR_FOR_DIVISION_BY_ZERO: INSERT または UPDATE プロセス中に、データがゼロで除算されると、警告ではなくエラーが生成されます。モードが指定されていない場合、データがゼロで除算されると MySQL は NULL を返します。
NO_AUTO_CREATE_USER: GRANT による空のパスワードを持つユーザーの作成を無効にします
NO_ENGINE_SUBSTITUTION: 必要なストレージ エンジンが無効かどうかコンパイルすると、エラーがスローされます。この値が設定されていない場合、デフォルトのストレージ エンジンが代わりに使用され、例外がスローされます。
PIPES_AS_CONCAT: "||" を OR 演算子ではなく文字列接続演算子として扱います。 Oracle データベース 同様に、文字列連結関数 Concat
ANSI_QUOTES: ANSI_QUOTES を有効にした後は、文字列が識別子として解釈されるため、二重引用符を使用して文字列を引用することはできません。
推奨学習: 「
MySQL ビデオ チュートリアル」
以上がMySQL設定only_full_group_byのエラー報告問題を詳しく解説した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。