mysql'de genel sql_mode ayarı


91

Mysql'de sql_mode ayarlamaya çalışıyorum ama bir hata veriyor.

Komut:

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

Birden çok modu ayarlamanın doğru yolu bu değil mi? Oturum ve genel modları ayarlamanın avantajları nelerdir? hangisi tercih edilir? Veritabanını farklı UNC değerleriyle güncellemeye çalışan farklı kullanıcılarım var ve oturum modunu 'NO_BACKSLASH_ESCAPES' olarak ayarlamayı denedim, bunun için bir gloabl modu ayarlamanın mantıklı olacağını düşündüm. Bu mantıklı mı?

Lütfen bana haber ver.

Teşekkürler.


Bu hatalı alıntılar beni gerçekten rahatsız ediyor; s. Diğerlerinin dediği gibi eminim, bu kesinlikle sadece bu yüzden doğru değil.
dyasta

Yanıtlar:


205

BTW, MySQL'de global ayarlarsanız:

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

Bu onu KALICI OLARAK ayarlamaz ve her yeniden başlatmadan sonra eski haline döner.

Bu yüzden, bunu yapılandırma dosyanızda (örneğin /etc/mysql/my.cnf[mysqld] bölümünde) ayarlamalısınız, böylece değişiklikler MySQL yeniden başlatıldıktan sonra da geçerli kalır:

Yapılandırma Dosyası: /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

GÜNCELLEME: Mysql'in daha yeni sürümleri (ör. 5.7.8 veya üstü) biraz farklı sözdizimi gerektirebilir:

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

Alt çizgi sql-modedeğil ile modların çift tırnak içinde olduğundan emin olun .

Her zaman referans MySQL Dokümanlar için sizin görmek sürümü sql modu seçenekleri .


2
Teşekkürler, my.cnf'yi ayarlamak benim için hile yaptı. İlgilenenler için, bu sayfa 5.7 ve üzeri varsayılan sql_mode'ların
Richard

2
5.7 sürüm notu! Sorun buydu.
Ernestas Stankevičius

Gerçek bir web uygulamasında ikinci sorgu çalışır. Mysqli bağlantı sorgusundan sonra başka bir sorgu ekledim. SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; Teşekkürler Chad!
GTodorov

1
Gelen 5.7.20ve durumu için mysql.ini, çizgi kullanılarak ve tırnak unutmadan bu yüzden sadece para cezası, gibi çalışır:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo

30

Ben çözdüm.

doğru mod şudur:

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

17
UYARI: Deneyimlerimize göre bu, MySQL yeniden başlatıldıktan sonra ayarı korumaz ...
Chadwick Meyer

1
Evet, bu yeniden başlatmadan sonra ayarları korumaz
prakashpoudel

4
Unix için yeniden başlattıktan sonra saklamak için bir ~ / .my.cnf dosyası oluşturmam ve [mysqld] sql_mode = "<new mode>" eklemem gerekiyordu. Umarım bu yardımcı olur
Raman Singh

27

Mysql yapılandırma dosyasını kullanarak sql modunu kalıcı olarak ayarlama.

Benim durumumda, dosyayı dahil edildiği /etc/mysql/mysql.conf.d/mysqld.cnfgibi değiştirmem gerekiyor . bunu [mysqld] altında değiştiriyorummysql.conf.d/etc/mysql/my.cnf

[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"

sadece ONLY_FULL_GROUP_BYsql modu kaldırıldı çünkü soruna neden oluyordu.

Ben kullanıyorum ubuntu 16.04, php 7ve MySQL version vermek beni bumysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

Bu değişiklikten sonra aşağıdaki komutları çalıştırın

sudo service mysql stop
sudo service mysql start

Şimdi bu sorgu SELECT @@sql_modeile sql modlarını kontrol edin ve yeni ayarladığınız modları almalısınız.


14

Yapılandırma Dosyasına Kopyala: /etc/mysql/my.cnf OR /bin/mysql/my.ini

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

MySQL tekrar başlat.

Ya da sen de yapabilirsin

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

MySQL tekrar başlat.


2
Bunun sql_modeyerine olduğunu düşünüyorum sql-mode.
Raman Sahasi

13

MySQL 8 için bu hatayı araştıran biri için.

MySQL 8.0.11, sql modundan 'NO_AUTO_CREATE_USER' öğesini kaldırın.

MySQL 5.7: Kullanıcı oluşturmak için GRANT kullanma. Bunun yerine CREATE USER kullanın. Bu uygulamayı takip etmek NO_AUTO_CREATE_USER SQL modunu GRANT ifadeleri için önemsiz kılar, bu nedenle de kullanımdan kaldırılmıştır. MySQL 8.0.11: Kullanıcı oluşturmak için GRANT kullanma. Bunun yerine CREATE USER kullanın. Bu uygulamayı takip etmek NO_AUTO_CREATE_USER SQL modunu GRANT ifadeleri için önemsiz kılar, bu nedenle de kaldırılır.

Buradan alındı

Öyleyse, sql_modeşu şekilde olabilir:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Veya Docker kullanıyorsanız, docker-compose.yml'ye next komutu ekleyebilirsiniz.

  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

Geçici değişiklik için aşağıdaki komutu kullanın

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

Kalıcı değişiklik için: /etc/my.cnf veya /etc/mysql/mysql.conf.d/mysqld.cnf yapılandırma dosyasına gidin ve aşağıdaki satırları ekleyin ve ardından mysql hizmetini yeniden başlatın

[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

Veritabanına yönetici kullanıcı olarak erişin (kök olabilir).

Mevcut SQL_mode'u kontrol edin

mysql> SELECT @@sql_mode;

Yeni bir sql_mode ayarlamak için, veritabanından çıkın, bir dosya oluşturun

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

sql_mode içeriğinizle

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

Mysql'i yeniden başlatın

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

/Etc/mysql/conf.d/ klasöründe bir dosya oluşturuyoruz çünkü ana yapılandırma dosyasında /etc/mysql/my.cnf komut, / etc / mysql / conf klasöründeki tüm ayar dosyalarını içerecek şekilde yazılmıştır . d /


1

Benim durumumda, dosyayı /etc/mysql/mysql.conf.d/mysqld.cnf[ mysqld] altında değiştirmem gerekiyor

Bu satırı [ mysqld] kısmına yapıştırın

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'in (5.6.45) sql_modehiçbir yapılandırma dosyasından kabul etmediği benzer bir sorun yaşadım .

Çözüm, init_file = /etc/mysql/mysql-init.sqlyapılandırma dosyasına eklemek ve ardından SET GLOBAL sql_mode = '';orada çalıştırmaktı .


1

Sql_mode belgelerine bakın

Yöntem 1:

Sql_mode'un varsayılan değerini kontrol edin:

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";

Yöntem 2:

Düzenlemek için phpmyadmin'e erişin sql_mode

  • Phpmyadmin'de oturum açın ve localhost'u açın
  • En üstteki Değişkenler menü öğelerinde en üstte bulunur ve sql modu aranır
  • Gereksinimlerinize göre sql_mode'u değiştirmek için düzenle düğmesine tıklayın
  • Değişiklikleri kaydedin

phpmyadmin'de sql modu ayarları

Yukarıdaki şeyleri gerçekleştirdikten sonra sunucuyu yeniden başlatın


1

Benim durumumda mysql ve ubuntu 18.04

Bu komutu kullanarak kalıcı olarak ayarladım

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

Konfigürasyondan sonra satırı ekleyin. Aşağıdaki resimde vurgulanan örneğe bakın.

sql_mode = ""

Not: Burada farklı modlar da ekleyebilirsiniz, ihtiyacınıza bağlıdır NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

Kullanılabilir sql modları referansı ve Belgelerine bakın

sql modu ekleyerek

Sonra kaydedin. Kaydettikten sonra mysql hizmetinizi yeniden başlatmanız gerekir, aşağıdaki komutu takip edin:

sudo service mysql restart

Bu yardımcı olur umarım :-)


0

Birisi bunu yalnızca mevcut oturum için ayarlamak istiyorsa, aşağıdaki komutu kullanın

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

-3
global sql_mode = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION" ayarla
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.