Bagaimana untuk menetapkan mod sql lalai MySQL

王林
Lepaskan: 2023-05-27 21:52:30
ke hadapan
1903 orang telah melayarinya

Mod SQL

Mod SQL lalai MySQL 5.7 termasuk ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER dan NO_ENGINE_SUBSTITUTION.

Ini ialah penerangan asal dari tapak web rasmi MySQL: "Mod ini telah ditambahkan pada mod SQL lalai dalam MySQL 5.7: Mod ONLY_FULL_GROUP_BY dan STRICT_TRANS_TABLES telah ditambahkan dalam MySQL 5.7.5. telah ditambahkan dalam MySQL 5.7.7 Mod NO_AUTO_CREATE_USER, ERROR_FOR_DIVISION_BY_ZERO dan NO_ZERO_DATE telah ditambahkan dalam MySQL 5.7.8 Untuk perbincangan tambahan mengenai perubahan ini pada nilai mod SQL lalai dalam MySQL 5.7 ."NO_ZERO_IN_DATE

tunjukkan mod sql

SELECT @@GLOBAL.sql_mode;

SELECT @@SESSION.sql_mode;
Salin selepas log masuk

tetapkan mod sql

ditetapkan kepada GLOBAL, maka semua pelanggan akan terjejas, tetapi anda mesti mempunyai kebenaran SUPER untuk menetapkan Jika anda adalah pengguna akar dan menetapkan SESI, maka hanya sesi sambungan semasa akan terjejas.

SET GLOBAL sql_mode ='ONLY_FULL_GROUP_BY'

SET SESSION sql_mode ='ONLY_FULL_GROUP_BY'
Salin selepas log masuk

Di bawah ini kami akan menerangkan secara terperinci mod SQL lalai Bagi yang lain, anda boleh pergi ke laman web rasmi untuk rujukan.

docs.oracle.com/cd/E17952_0…

Mod SQL lalai

ONLY_FULL_GROUP_BY

menetapkan nilai ini, dalam Medan yang muncul selepas SELECT mesti muncul selepas GROUP BY, jika tidak, ralat akan dilaporkan seperti berikut

Ungkapan #3 senarai SELECT tiada dalam klausa GROUP BY dan mengandungi lajur 'blue.shop tanpa agregat. price' yang tidak bergantung secara fungsional pada lajur dalam klausa GROUP BY; ini tidak serasi dengan sql_mode=only_full_group_by

Yang berikut menggunakan sql_mode lalai MySQL

GRONLY_UP_NOLL_DATE,TRANS_PERTAMA ,NO_ZERO_ TARIKH ,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Kemudian penyataan berikut akan melaporkan ralat, kerana hanya terdapat satu medan selepas GROUP BY, dan SELECT * mencari semua medan, jadi ralat dilaporkan.

SELECT * FROM shop GROUP BY article
Salin selepas log masuk

Menulis dengan cara ini tidak akan melaporkan ralat

SELECT * FROM shop GROUP BY article , dealer , price
Salin selepas log masuk

Walau bagaimanapun, adalah mustahil untuk kami menggunakan GROUP BY diikuti oleh semua medan, yang jelas tidak munasabah, jadi ia harus dimatikan dan hanya perlu Alih keluar sahaja

STRICT_TRANS_TABLES

Mod ketat MySQL boleh mengawal cara mengendalikan nilai yang tidak sah atau hilang dalam pernyataan INSERT atau UPDATE. Nilai mungkin tidak sah atas banyak sebab. Sebagai contoh, ia mungkin mempunyai jenis data yang salah untuk lajur, atau ia mungkin berada di luar julat. Masalah ini berlaku untuk baris baharu yang disisipkan di mana nilai lajur bukan nol tiada dan nilai lalai tidak dinyatakan secara eksplisit dalam takrifan.

Sebagai contoh, jika salah satu tetapan medan kami tidak boleh NULL, dan medan data yang kami masukkan ialah NULL, maka ia tidak akan lulus dan ralat akan dilaporkan seperti berikut:

1364 - 'peniaga' medan tidak mempunyai nilai lalai

Jadi bagaimana untuk menyelesaikan masalah ini? Saya percaya setiap orang sering menghadapi masalah ini Secara amnya, atribut entiti tidak diberikan nilai apabila kami memasukkan data, yang menyebabkan masalah ini, jadi kami akan menyemak kod dan kemudian menetapkan nilai kepada atribut

, Dengan cara ini, pengesahan tidak akan dilakukan, tetapi sangat tidak disyorkan, kerana kami perlu memastikan integriti data, jadi kami mesti melakukan kerja yang baik pada tahap kod. STRICT_TRANS_TABLES

NO_ZERO_IN_DATE

Mod NO_ZERO_IN_DATE mempengaruhi sama ada pelayan membenarkan tarikh dengan bahagian bukan sifar tahun tetapi 0 untuk bahagian bulan atau hari. (Mod ini mempengaruhi tarikh seperti '2010-00-01' atau '2010-01-00', tetapi bukan '0000-00-00'. Untuk mengawal sama ada pelayan membenarkan '0000-00-00', gunakan Mod NO_ZERO_DATE .) Kesan NO_ZERO_IN_DATE juga bergantung pada sama ada mod SQL ketat didayakan Jika mod SQL ketat tidak didayakan

, maka tidak ada gunanya mendayakan NO_ZERO_IN_DATE. STRICT_TRANS_TABLES

Tarikh bulan dan hari SQL berikut ialah 0, dan mod ketat

dan NO_ZERO_IN_DATE didayakan, maka ralat akan dilaporkan. STRICT_TRANS_TABLES

INSERT INTO `blue`.`shop` (`article`, `dealer` ,`price`,`date`) VALUES ('商品5', '5', 5.00, '2022-00-00');
Salin selepas log masuk

1292 - Nilai masa tarikh salah: '2022-00-00' untuk lajur 'tarikh' di baris 1

Alih keluar mod ketat

dan STRICT_TRANS_TABLES Tidak akan ada kesilapan. NO_ZERO_IN_DATE

NO_ZERO_DATE

NO_ZERO_IN_DATE di atas boleh memasukkan '0000-00-00' Jika mod ketat

dan NO_ZERO_DATE digunakan, maka '0000-00-00' tidak boleh dimasukkan. STRICT_TRANS_TABLES

ERROR_FOR_DIVISION_BY_ZERO

Untuk INSERT atau UPDATE, jika dividen adalah 0, ralat akan berlaku dan data tidak boleh dimasukkan Begitu juga untuk MOD(N,M)

INSERT INTO `blue`.`shop` (`article`,dealer ,`price`,`date`) VALUES ('商品5', '5', MOD(10,0), '0000-00-00');
Salin selepas log masuk

Untuk SELECT, jika dividen adalah 0, NULL akan dikembalikan, begitu juga MOD(N,M).

SELECT price / 0  FROM shop
Salin selepas log masuk

Mesej ralat: 1365 - Pembahagian dengan 0

NO_AUTO_CREATE_USER

Anda tidak boleh menggunakan arahan pemberian untuk mencipta pengguna dengan kata laluan kosong.

NO_ENGINE_SUBSTITUTION

如果指定了NO_ENGINE_SUBSTITUTION,我们在创建表或者修改表的时候,如果去指定了不存在或者不支持的存储引擎,那么就会报错,无法创建和修改,如果没有配置NO_ENGINE_SUBSTITUTION,那么就会将我们指定的存储引擎(不支持或者不存在)的存储引擎替换为默认的存储引擎,MySQL5.7后的默认存储引擎为InnoDB,所以就会自动设置为InnoDB。

如下我们创建表,将存储引擎设置为一个不存在的InnoDBTest,因为我们去除了NO_ENGINE_SUBSTITUTION,所以不会报错,并且会替换成默认的InnoDB

创建sql

CREATE TABLE store ( `name` VARCHAR ( 255 ) DEFAULT NULL ) ENGINE = InnoDBTest
Salin selepas log masuk

查看创建过程

SHOW CREATE TABLE store
Salin selepas log masuk

结果

CREATE TABLE `store` (
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Salin selepas log masuk

MySQL存储引擎

SHOW ENGINES;
Salin selepas log masuk

MySQL默认的sql mode怎么设置

Atas ialah kandungan terperinci Bagaimana untuk menetapkan mod sql lalai MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan