Persekitaran pembangunan disambungkan kepada mysql5.6
, manakala persekitaran ujian adalah kepada mysql5.7
. Semasa pembangunan, seorang rakan menulis kenyataan group by
tentang sql
. Ia berjalan seperti biasa dalam persekitaran pembangunan, tetapi pengecualian ditemui dalam persekitaran ujian.
Analisis sebab: Versi MySQL5.7
mempunyai atribut mysql sql_mode = only_full_group_by
yang ditetapkan secara lalai, menyebabkan ralat.
Antaranya, ONLY_FULL_GROUP_BY
adalah punca ralat ini dalam mod ketat ini, untuk operasi pengagregatan group by
, jika lajur dalam select
tidak muncul dalam group by
, maka Ini <.> adalah haram. Kerana dalam SQL
yang ditulis oleh pembangun, lajur sql
tiada dalam klausa select
dan ralat akan dilaporkan apabila menggunakan group by
. group by
dan mod mysql5.7.x
didayakan secara lalai. only_full_group_by
1. Semak sql_mode
SELECT` `@@sql_mode;
SAHAJA_PENUH_GROUP_OLEH,STRICT_TRANS_TABLES_DATE,NO_NO_IN_TARIKH,NO_NO_NO_IN_DATE NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
2. Alih keluar SAHAJA_FULL_GROUP_BY dan tetapkan semula nilai.
SET` `@@``global``.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. Perkara di atas menukar mod_sql global, yang sah untuk pangkalan data yang baru dibuat.
Untuk pangkalan data sedia ada, anda perlu melaksanakannya di bawah data yang sepadanSET` `sql_mode =``'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'``;
Kaedah di atas masih tidak sah selepas memulakan semula pangkalan data mysql kaedah masih berkesan selepas dimulakan semula. kata kunci ini dalam fail konfigurasi, jadi saya menambahnya secara manual Masukkan:
Satu perkara yang perlu diambil perhatian ialah ia mesti ditambah dalam konfigurasi, supaya ia akan berkuat kuasa selepas menambah MySQL
dan mulakannya semula. Keluar dari pangkalan data: keluar, mulakan semula perintah: linux
/etc/my.cnf
sql_mode
Muat semula halaman dan mesej ralat hilang sambung semula ke pangkalan data untuk melihat
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
<. . lebih berkaitan dalam group by maka sql ini menyalahi undang-undang kerana lajur tidak berada klausa>[mysqld]mysql
NO_AUTO_VALUE_ON_ZERO: Nilai ini mempengaruhi sisipan lajur yang meningkat secara automatik. Di bawah tetapan lalai, memasukkan 0 atau NULL mewakili penjanaan nilai peningkatan automatik seterusnya. Pilihan ini berguna jika pengguna ingin memasukkan nilai 0 dan lajur meningkat secara automatik.
service mysqld restart #lnmp重启mysql lnmp restart mysql
sql_mode
NO_ZERO_IN_DATE: Dalam mod ketat, tarikh dan bulan sifar tidak dibenarkan select @@sql_mode
NO_AUTO_CREATE_USER: Melumpuhkan GRANT daripada mencipta pengguna dengan kata laluan kosongERROR_FOR_DIVISION_BY_ZERO: Semasa proses INSERT atau UPDATE, jika data dibahagikan dengan sifar, ralat dijana dan bukannya amaran. Jika mod tidak diberikan, MySQL mengembalikan NULL apabila data dibahagikan dengan sifar
Mysql5.7
NO_ENGINE_SUBSTITUTION: Jika enjin storan yang diperlukan dilumpuhkan atau tidak disusun, maka ralat dilemparkan. Apabila nilai ini tidak ditetapkan, enjin storan lalai digunakan dan pengecualian dilemparkan ONLY_FULL_GROUP_BY
Mysql5.7 ONLY_FULL_GROUP_BY
PIPES_AS_CONCAT: Anggap "||" sebagai operator sambungan rentetan dan bukannya operator OR, yang sama dengan pangkalan data Oracle Begitu juga, ia serupa dengan fungsi penggabungan rentetan Concat
ANSI_QUOTES: Selepas mendayakan ANSI_QUOTES, petikan berganda tidak boleh digunakan untuk memetik rentetan kerana ia ditafsirkan sebagai pengecam. Pembelajaran yang disyorkan: "
Tutorial Video MySQL"
Atas ialah kandungan terperinci Artikel yang menerangkan secara terperinci tetapan MySQL only_full_group_oleh masalah pelaporan ralat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!