Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Menyelesaikan Ralat \"Campuran Haram Pengumpulan\" dalam MySQL?

Bagaimana untuk Menyelesaikan Ralat \"Campuran Haram Pengumpulan\" dalam MySQL?

DDD
DDDasal
2024-11-16 10:34:02535semak imbas

How to Solve the

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!

Kenyataan:
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