mysql में वैश्विक sql_mode सेट करना


94

मैं mysql में sql_mode सेट करने का प्रयास कर रहा हूं, लेकिन यह एक त्रुटि फेंकता है।

कमान:

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

क्या यह कई मोड सेट करने का उचित तरीका नहीं है? सत्र और वैश्विक मोड सेट करने के क्या फायदे हैं? जो प्रचलित है मेरे पास अलग-अलग उपयोगकर्ता हैं जो अलग-अलग यूएनसी मूल्यों के साथ डेटाबेस को अपडेट करने की कोशिश कर रहे हैं और सत्र मोड को 'NO_BACKSLASH_ESCAPES' में स्थापित करने की कोशिश कर रहे हैं, हालांकि मुझे इसके लिए एक ग्लोबबल मोड बनाने के लिए समझ में आएगा। इसका कोई मतलब भी है क्या?

कृपया मुझे बताओ।

धन्यवाद।


वे गलत उद्धरण मुझे बहुत परेशान करते हैं; पी। जैसा कि दूसरों ने कहा कि मुझे यकीन है, यह निश्चित रूप से सिर्फ इसलिए ठीक नहीं है।
डाइस्टा

जवाबों:


211

BTW, यदि आप MySQL में ग्लोबल्स सेट करते हैं:

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

यह इसे स्थायी रूप से सेट नहीं करेगा , और यह प्रत्येक पुनरारंभ के बाद वापस आ जाएगा।

इसलिए आपको इसे अपनी कॉन्फिग फाइल (उदाहरण /etc/mysql/my.cnfके लिए [mysqld] सेक्शन) में सेट करना चाहिए , ताकि एसक्यूएल रीस्टार्ट होने के बाद बदलाव प्रभावी रहे:

विन्यास फाइल: /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

अद्यतन: मैसूर के नए संस्करणों (उदाहरण के लिए 5.7.8 या इसके बाद के संस्करण) को थोड़ा अलग वाक्यविन्यास की आवश्यकता हो सकती है:

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

सुनिश्चित करें कि sql-modeअंडरस्कोर नहीं के बीच एक डैश है , और यह मोड डबल कोट्स में हैं।

Sql- मोड विकल्पों को देखने के लिए हमेशा अपने संस्करण के लिए MySQL डॉक्स को देखें ।


2
धन्यवाद, my.cnf में सेटिंग ने मेरे लिए चाल चली। रुचि रखने वालों के लिए, यह पृष्ठ बताता है कि डिफ़ॉल्ट sql_modes 5.7 और इसके बाद के संस्करण में क्या है: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
रिचर्ड

2
5.7 संस्करण ध्यान दें! यही समस्या थी।
अर्नेस्टस स्टैंकेविसियस

एक वास्तविक वेब एप्लिकेशन में दूसरी क्वेरी काम करती है। मैंने mysqli कनेक्शन क्वेरी के बाद एक और क्वेरी जोड़ दी। SET SIONION sql_mode = 'NO_ENGINE_SUBSTITUTION'; धन्यवाद चाड!
GTodorov

1
में 5.7.20, और के मामले के लिए mysql.ini, एक अंडरस्कोर का उपयोग कर और उद्धरण भूल ठीक, की तरह काम करता है ताकि:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo

32

मैंने इसे हल किया।

सही मोड है:

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

17
चेतावनी: हमारे अनुभव में यह MySQL पुनः आरंभ करने के बाद सेटिंग को बरकरार नहीं रखता है ...
चाडविक मेयर

1
हां यह पुनः आरंभ करने के बाद सेटिंग्स को बरकरार नहीं रखता है
प्रकाशपुडेल

4
यूनिक्स के लिए पुनरारंभ करने के बाद इसे बनाए रखने के लिए, मुझे एक ~ / .my.cnf फ़ाइल बनानी थी और [mysqld] sql_mode = "<new mode>" जोड़ना होगा। आशा है कि यह मदद करता है
रमन सिंह

28

स्थायी रूप से mysql config फाइल का उपयोग करके 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.04, php 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और आपको वे मोड्स मिलने चाहिए जो आपने अभी-अभी सेट किए हैं।


15

विन्यास फाइल पर कॉपी करें: /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
रमन सहसी

14

जो कोई MySQL 8 के लिए इस त्रुटि को googling करता है।

MySQL 8.0.11 ने 'NO_AUTO_CREATE_USER' को sql-mode से हटा दिया।

MySQL 5.7: उपयोगकर्ताओं को बनाने के लिए GRANT का उपयोग करना। इसके बजाय, CREATE USER का उपयोग करें। इस अभ्यास के बाद GRANT स्टेटमेंट्स के लिए NO_AUTO_CREATE_USER SQL मोड को अपरिवर्तित कर देता है, इसलिए इसे भी हटा दिया जाता है। MySQL 8.0.11: उपयोगकर्ताओं को बनाने के लिए GRANT का उपयोग करना। इसके बजाय, CREATE USER का उपयोग करें। इस अभ्यास के बाद GR_ कथनों के लिए NO_AUTO_CREATE_USER SQL मोड को अपरिवर्तित करता है, इसलिए इसे भी हटा दिया जाता है।

यहां से ले गए

तो, आपका sql_modeऐसा हो सकता है:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

या यदि आप डॉकर का उपयोग कर रहे हैं, तो आप अगले कमांड को 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}

4

अस्थायी परिवर्तन के लिए निम्न आदेश का उपयोग करें

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

स्थायी परिवर्तन के लिए: config file /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"

3

डेटाबेस को व्यवस्थापक उपयोगकर्ता के रूप में एक्सेस करें (रूट हो सकता है)।

वर्तमान 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> sudo service mysql stop
mysql> sudo service mysql start

हम फ़ोल्डर /etc/mysql/conf.d/ में एक फ़ाइल बनाते हैं क्योंकि मुख्य कॉन्फ़िगरेशन फ़ाइल /etc/mysql/my.cnf में फ़ोल्डर / etc / mybql / conf से सभी सेटिंग्स फ़ाइलों को शामिल करने के लिए कमांड लिखा जाता है । घ /


2

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_mode को संशोधित करने के लिए संपादन बटन पर क्लिक करें
  • परिवर्तनों को सुरक्षित करें

phpmyadmin में sql मोड सेटिंग्स

उपरोक्त चीजों को निष्पादित करने के बाद सर्वर को पुनरारंभ करें


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

मेरे मामले में 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_SUBSTERUTION

उपलब्ध एसक्यूएल मोड संदर्भ और प्रलेखन देखें

sql मोड जोड़ना

फिर सेव करें। सहेजने के बाद आपको अपनी mysql सेवा को पुनरारंभ करने की आवश्यकता है, नीचे दिए गए आदेश का पालन करें:

sudo service mysql restart

उम्मीद है की यह मदद करेगा :-)


0

यदि कोई इसे केवल वर्तमान सत्र के लिए सेट करना चाहता है तो निम्न कमांड का उपयोग करें

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.