Rumah > Artikel > pangkalan data > Bagaimana untuk Menyelesaikan Ralat \"Campuran Haram Pengumpulan\" dalam MySQL?
Mengatasi Ralat Campuran Haram Pengumpulan dalam MySQL
Apabila melaksanakan operasi pangkalan data yang melibatkan membandingkan atau memanipulasi data teks, adalah penting untuk memastikan konsistensi dalam himpunan watak. Dalam MySQL, mesej ralat "Campuran pengumpulan yang tidak sah" biasanya menunjukkan ketidakserasian antara himpunan yang digunakan untuk operan dalam operasi.
Dalam kod yang disediakan, isu timbul daripada konflik antara pengumpulan yang digunakan dalam jadual berikut dan prosedur tersimpan:
CREATE TABLE users ( ... ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci; CREATE TABLE products ( ... ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci; CREATE TABLE productUsers ( ... ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci; CREATE PROCEDURE updateProductUsers (IN rUsername VARCHAR(24),IN rProductID INT UNSIGNED,IN rPerm VARCHAR(16)) BEGIN UPDATE productUsers INNER JOIN users ON productUsers.userID = users.userID SET productUsers.permission = rPerm WHERE users.username = rUsername AND productUsers.productID = rProductID; END
Parameter input prosedur tersimpan dan lajur nama pengguna jadual pengguna diisytiharkan dengan pengumpulan lalai utf8_general_ci, manakala lajur kebenaran jadual productUsers dan parameter rPerm diisytiharkan dengan pengumpulan utf8_unicode_ci .
Untuk menyelesaikan isu ini, anda mempunyai beberapa pilihan:
Pilihan 1: Tambahkan COLLATE pada Pembolehubah Input
Tambah klausa COLLATE pada input pembolehubah dalam panggilan prosedur tersimpan untuk menyatakan secara eksplisit himpunan utf8_unicode_ci.
$rUsername = 'aname' COLLATE utf8_unicode_ci; $call = "CALL updateProductUsers(@rUsername, @rProductID, @rPerm);";
Pilihan 2: Tambahkan COLLATE ke Klausa WHERE
Tambah klausa COLLATE pada klausa WHERE dalam takrifan prosedur tersimpan untuk menentukan pengumpulan utf8_unicode_ci untuk lajur users.username.
CREATE PROCEDURE updateProductUsers( IN rUsername VARCHAR(24), IN rProductID INT UNSIGNED, IN rPerm VARCHAR(16)) BEGIN UPDATE productUsers INNER JOIN users ON productUsers.userID = users.userID SET productUsers.permission = rPerm WHERE users.username = rUsername COLLATE utf8_unicode_ci AND productUsers.productID = rProductID; END
Pilihan 3: Tambahkan COLLATE ke dalam Definisi Parameter
Untuk versi MySQL sebelum 5.7, anda boleh menambah klausa COLLATE pada definisi parameter IN dalam prosedur tersimpan itu sendiri.
CREATE PROCEDURE updateProductUsers( IN rUsername VARCHAR(24) COLLATE utf8_unicode_ci, IN rProductID INT UNSIGNED, IN rPerm VARCHAR(16)) BEGIN UPDATE productUsers INNER JOIN users ON productUsers.userID = users.userID SET productUsers.permission = rPerm WHERE users.username = rUsername AND productUsers.productID = rProductID; END
Pilihan 4: Ubah Medan Jadual
Ubah lajur nama pengguna dalam jadual pengguna untuk menggunakan pengumpulan utf8_unicode_ci.
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Walaupun utf8_general_ci biasanya lebih pantas untuk pengisihan data, adalah disyorkan untuk menggunakan utf8mb4/utf8mb4_unicode_ci kerana ia menyokong julat aksara Unicode yang lebih luas>
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat \"Campuran Haram Pengumpulan\" dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!