mysqlでグローバルsql_modeを設定する


91

mysqlでsql_modeを設定しようとしていますが、エラーがスローされます。

コマンド:

set global sql_mode='NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLE','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'

これは複数のモードを設定する適切な方法ではありませんか?セッションモードとグローバルモードを設定する利点は何ですか?どちらが好ましいですか?さまざまなユーザーがさまざまなUNC値でデータベースを更新しようとし、セッションモードを「NO_BACKSLASH_ESCAPES」に設定するように指示しましたが、これにはgloablモードを設定するのが理にかなっています。これは意味がありますか?

私にお知らせください。

ありがとう。


それらの誤った引用は本当に私を悩ませます; p。他の人が私が確信していると言ったように、これはそれだけのために間違いなく正しくありません。
dyasta 2017年

回答:


205

ところで、MySQLでグローバルを設定した場合:

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

これは永続的に設定されるわけではなく、再起動するたびに元に戻ります。

したがって、これを設定ファイル(/etc/mysql/my.cnf[mysqld]セクションなど)で設定して、MySQLの再起動後も変更が有効になるようにする必要があります。

設定ファイル:/etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

更新:Mysqlの新しいバージョン(5.7.8以降など)では、わずかに異なる構文が必要になる場合があります。

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

sql-modeアンダースコアではない間にダッシュがあり、モードが二重引用符で囲まれていることを確認してください。

常に参照するMySQLのドキュメントをするために、あなたの見るために、バージョンのSQLモードオプションを


2
ありがとう、my.cnfに設定することでうまくいきました。興味のある方のために、このページでは、5.7以降のデフォルトのsql_modesについて説明しています。dev.mysql.com/ doc / refman / 5.7 / en
Richard

2
5.7バージョンノートアップ!それが問題でした。
ErnestasStankevičius

実際のWebアプリケーションでは、2番目のクエリが機能します。mysqli接続クエリの後に別のクエリを追加しました。SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; ありがとうチャド!
GTodorov 2018年

1
では5.7.20、とのケースのために mysql.iniアンダースコアを使用して引用符を忘れて、そうのように、うまく動作します:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo

30

私はそれを解決しました。

正しいモードは次のとおりです。

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

17
警告:私たちの経験では、これはMySQLの再起動後に設定を保持しません...
Chadwick Meyer

1
はい、これは再起動後に設定を保持しません
prakashpoudel 2016年

4
UNIXの再起動後に保持するには、〜/ .my.cnfファイルを作成し、[mysqld] sql_mode = "<newmode>"を追加する必要がありました。この情報がお役に立てば幸い
ラマン・シン

27

mysql設定ファイルを使用してsqlモードを永続的に設定します。

私の場合は、ファイルを変更する必要があります/etc/mysql/mysql.conf.d/mysqld.cnfようmysql.conf.dに含まれています/etc/mysql/my.cnf。[mysqld]でこれを変更します

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

ONLY_FULL_GROUP_BYSQLモードを削除したところ、問題が発生していました。

私はを使用していますubuntu 16.04php 7そしてmysql--versionは私にこれを与えますmysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

この変更後、以下のコマンドを実行します

sudo service mysql stop
sudo service mysql start

このクエリでSQLモードを確認するSELECT @@sql_modeと、設定したばかりのモードが得られるはずです。


14

構成ファイルにコピー: /etc/mysql/my.cnf OR /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

MySQL 再起動。

またはあなたもすることができます

[mysqld]
port = 3306
SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

MySQL 再起動。


2
sql_mode代わりだと思いますsql-mode
ラマンサハシ2016年

13

MySQL8でこのエラーをグーグルで検索している人のために。

MySQL 8.0.11は、sql-modeから「NO_AUTO_CREATE_USER」を削除します。

MySQL 5.7:GRANTを使用してユーザーを作成します。代わりに、CREATEUSERを使用してください。この方法に従うと、NO_AUTO_CREATE_USER SQLモードはGRANTステートメントにとって重要ではなくなるため、これも非推奨になります。MySQL 8.0.11:GRANTを使用してユーザーを作成します。代わりに、CREATEUSERを使用してください。この方法に従うと、NO_AUTO_CREATE_USER SQLモードはGRANTステートメントにとって重要ではなくなるため、それも削除されます。

ここから撮影

だから、あなたsql_modeはこのようになることができます:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

または、Dockerを使用している場合は、次のコマンドをdocker-compose.ymlに追加できます。

  mysql:
    image: mysql:8.0.13
    command: --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    ports:
      - 13306:${MYSQL_PORT}

3

一時的な変更には、次のコマンドを使用します

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

永続的な変更の場合:構成ファイル/etc/my.cnfまたは/etc/mysql/mysql.conf.d/mysqld.cnfに移動し、次の行を追加してからmysqlサービスを再起動します

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

2

管理者ユーザー(おそらくroot)としてデータベースにアクセスします。

現在のSQL_modeを確認してください

mysql> SELECT @@sql_mode;

新しいsql_modeを設定するには、データベースを終了し、ファイルを作成します

nano /etc/mysql/conf.d/<filename>.cnf 

sql_modeコンテンツを使用

[mysqld]
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Mysqlを再起動します

mysql> sudo service mysql stop
mysql> sudo service mysql start

メインの設定ファイル/etc/mysql/my.cnfに 、フォルダ/ etc / mysql / confのすべての設定ファイルを含めるようにコマンドが記述されているため、フォルダ/etc/mysql/conf.d/にファイルを作成します。 d /


1

私の場合、ファイルを/etc/mysql/mysql.conf.d/mysqld.cnf変更する必要があります[ mysqld]の下でこれを変更します

この行を[ mysqld]部分に貼り付けます

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

MySQL(5.6.45)がsql_modeどの設定ファイルからも受け入れないという同様の問題がありました。

解決策はinit_file = /etc/mysql/mysql-init.sql、構成ファイルに追加してSET GLOBAL sql_mode = '';、そこで実行することでした。


1

sql_modeのドキュメントを確認してください

方法1:

sql_modeのデフォルト値を確認してください。

SELECT @@sql_mode //check current value for sql_mode

SET GLOBAL sql_mode = "NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

方法2:

phpmyadminにアクセスして編集します sql_mode

  • phpmyadminにログインし、ローカルホストを開きます
  • メニュー項目の上部にある変数の上部にあり、SQLモードを検索します
  • 要件に基づいてsql_modeを変更するには、編集ボタンをクリックします
  • 変更を保存します

phpmyadminのSQLモード設定

上記を実行した後、サーバーを再起動します


1

私の場合、mysqlとubuntu 18.04

このコマンドを使用して永続的に設定します

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

構成後に行を追加します。下の画像で強調表示されている例を参照してください。

sql_mode = ""

注:ここでさまざまなモードを追加することもできます。必要に 応じて、NO_BACKSLASH_ESCAPES、STRICT_TRANS_TABLE、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION

利用可能なSQLモードのリファレンスドキュメントを参照してください

SQLモードの追加

次に保存します。保存した後、mysqlサービスを再起動する必要があります。以下のコマンドに従ってください。

sudo service mysql restart

お役に立てれば :-)


0

現在のセッションに対してのみ設定する場合は、次のコマンドを使用します

set session sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.