pengaturan global sql_mode di mysql

91

Saya mencoba untuk mengatur sql_mode di mysql tetapi itu membuat kesalahan.

Perintah:

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

Bukankah ini cara yang tepat untuk menyetel banyak mode? Apa keuntungan dari mengatur sesi dan mode global? mana yang lebih diutamakan? Saya memiliki pengguna yang berbeda yang mencoba memperbarui database dengan nilai UNC yang berbeda dan menetapkan pengaturan mode sesi ke 'NO_BACKSLASH_ESCAPES', saya pikir akan masuk akal untuk menggunakan mode gloabl untuk ini. Apakah ini masuk akal?

Tolong beritahu saya.

Terima kasih.

JPro
sumber
Kutipan yang salah itu benar-benar mengganggu saya; p. Seperti yang dikatakan orang lain, saya yakin, ini pasti tidak benar hanya karena itu.
dyasta

Jawaban:

205

BTW, jika Anda mengatur global di MySQL:

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

Ini tidak akan mengaturnya SECARA PERMANEN , dan akan kembali setelah setiap restart.

Jadi, Anda harus mengatur ini di file konfigurasi Anda (misalnya /etc/mysql/my.cnfdi bagian [mysqld]), sehingga perubahan tetap berlaku setelah MySQL dimulai ulang:

File Konfigurasi: /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

PEMBARUAN: Versi MySQL yang lebih baru (mis. 5.7.8 atau yang lebih baru) mungkin memerlukan sintaks yang sedikit berbeda:

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

Pastikan bahwa ada tanda hubung di antara sql-modebukan garis bawah, dan mode tersebut dalam tanda kutip ganda.

Selalu rujuk MySQL Docs untuk versi Anda guna melihat opsi mode sql .

Chadwick Meyer
sumber
2
Terima kasih, pengaturan di my.cnf berhasil untuk saya. Bagi mereka yang tertarik, halaman ini memberi tahu Anda apa sql_modes default di 5.7 dan di atasnya: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Richard
2
5.7 catatan versi! Itulah masalahnya.
Ernestas Stankevičius
Dalam aplikasi web yang sebenarnya, kueri kedua berfungsi. Saya baru saja menambahkan kueri lain setelah kueri koneksi mysqli. SETEL SESI sql_mode = 'NO_ENGINE_SUBSTITUTION'; Terima kasih Chad!
GTodorov
1
Dalam 5.7.20, dan untuk kasus mysql.ini, menggunakan garis bawah dan melupakan tanda kutip berfungsi dengan baik, seperti:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo
30

Saya menyelesaikannya.

mode yang benar adalah:

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
JPro
sumber
17
PERINGATAN: Dalam pengalaman kami, ini tidak mempertahankan pengaturan setelah MySQL restart ...
Chadwick Meyer
1
Ya, ini tidak mempertahankan pengaturan setelah restart
prakashpoudel
4
Untuk mempertahankannya setelah restart untuk unix, saya harus membuat file ~ / .my.cnf dan menambahkan [mysqld] sql_mode = "<new mode>". Semoga ini bisa membantu
Raman Singh
27

Mengatur mode sql secara permanen menggunakan file konfigurasi mysql.

Dalam kasus saya, saya harus mengubah file /etc/mysql/mysql.conf.d/mysqld.cnfseperti mysql.conf.dyang disertakan dalam /etc/mysql/my.cnf. saya mengubah ini di bawah [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"

baru saja menghapus ONLY_FULL_GROUP_BYmode sql karena itu menyebabkan masalah.

Saya menggunakan ubuntu 16.04, php 7dan mysql --version memberi saya inimysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

Setelah perubahan ini, jalankan perintah di bawah ini

sudo service mysql stop
sudo service mysql start

Sekarang periksa mode sql dengan kueri ini SELECT @@sql_modedan Anda harus mendapatkan mode yang baru saja Anda atur.

Yashrajsinh Jadeja
sumber
14

Salin ke File Konfigurasi: /etc/mysql/my.cnf OR /bin/mysql/my.ini

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

MySQL mengulang kembali.

Atau Anda juga bisa melakukannya

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

MySQL mengulang kembali.

Devraj Gupta
sumber
2
Saya pikir itu sql_modebukan sql-mode.
Raman Sahasi
13

Untuk seseorang yang googling kesalahan ini untuk MySQL 8.

MySQL 8.0.11 menghapus 'NO_AUTO_CREATE_USER' dari sql-mode.

MySQL 5.7: Menggunakan GRANT untuk membuat pengguna. Sebagai gantinya, gunakan CREATE USER. Mengikuti praktik ini membuat mode SQL NO_AUTO_CREATE_USER tidak penting untuk pernyataan GRANT, jadi mode ini juga tidak digunakan lagi. MySQL 8.0.11: Menggunakan GRANT untuk membuat pengguna. Sebagai gantinya, gunakan CREATE USER. Mengikuti praktik ini membuat mode SQL NO_AUTO_CREATE_USER tidak penting untuk pernyataan GRANT, jadi mode ini juga akan dihapus.

Diambil dari sini

Jadi, Anda sql_modebisa seperti ini:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Atau jika Anda menggunakan Docker, Anda dapat menambahkan perintah berikutnya ke 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}
Serhii Popov
sumber
3

Untuk perubahan sementara gunakan perintah berikut

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

Untuk perubahan permanen: buka file konfigurasi /etc/my.cnf atau /etc/mysql/mysql.conf.d/mysqld.cnf dan tambahkan baris berikut lalu restart layanan 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"
Vineet Kumar
sumber
2

Akses database sebagai pengguna administrator (mungkin root).

Periksa SQL_mode saat ini

mysql> SELECT @@sql_mode;

Untuk mengatur sql_mode baru, keluar dari database, buat file

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

dengan konten sql_mode Anda

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

Mulai ulang Mysql

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

Kami membuat file di folder /etc/mysql/conf.d/ karena di file konfigurasi utama /etc/mysql/my.cnf perintah ditulis untuk memasukkan semua file pengaturan dari folder / etc / mysql / conf. d /

Eric Korolev
sumber
1

Dalam kasus saya, saya harus mengubah file, /etc/mysql/mysql.conf.d/mysqld.cnfubah ini di bawah [ mysqld]

Tempel baris ini pada [ mysqld] porsi

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
parmar shashikant
sumber
1

Saya baru saja mengalami masalah serupa di mana MySQL (5.6.45) tidak akan menerima sql_modedari file konfigurasi apa pun.

Solusinya adalah menambahkan init_file = /etc/mysql/mysql-init.sqlke file konfigurasi dan kemudian mengeksekusi SET GLOBAL sql_mode = '';di sana.

Cobra_Fast
sumber
1

Periksa dokumentasi sql_mode

Metode 1:

Periksa nilai default dari 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";

Metode 2:

Akses phpmyadmin untuk mengedit file sql_mode

  • Login di phpmyadmin dan buka localhost
  • Top on Variables hadir di atas di item menu dan cari mode sql
  • Klik tombol edit untuk mengubah sql_mode berdasarkan kebutuhan Anda
  • Simpan perubahannya

pengaturan mode sql di phpmyadmin

Mulai ulang server setelah menjalankan hal-hal di atas

Ankit Jindal
sumber
1

Dalam kasus saya mysql dan ubuntu 18.04

Saya mengaturnya secara permanen menggunakan perintah ini

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

Tambahkan baris setelah konfigurasi. Lihat contoh yang disorot pada gambar di bawah.

sql_mode = ""

Catatan: Anda juga dapat menambahkan mode yang berbeda di sini, tergantung kebutuhan Anda NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

Lihat Referensi dan Dokumentasi mode sql yang tersedia

menambahkan mode sql

Kemudian simpan. Setelah menyimpan Anda perlu me-restart layanan mysql Anda, ikuti perintah di bawah ini:

sudo service mysql restart

Semoga ini membantu :-)

Cristiana Chavez
sumber
0

Jika seseorang ingin mengaturnya hanya untuk sesi saat ini, gunakan perintah berikut

set session sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
ASHOK MANGHAT
sumber
-3
setel global sql_mode = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Shadab Khan Zed
sumber