MySQL의 \'잘못된 데이터 정렬 혼합\' 오류를 해결하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-11-16 10:34:02
원래의
534명이 탐색했습니다.

How to Solve the

MySQL의 잘못된 데이터 정렬 혼합 오류 해결

텍스트 데이터를 비교하거나 조작하는 데이터베이스 작업을 수행할 때 일관성을 보장하는 것이 중요합니다. 문자 조합에서. MySQL에서 "잘못된 데이터 정렬 혼합" 오류 메시지는 일반적으로 작업의 피연산자에 사용된 데이터 정렬 간의 비호환성을 나타냅니다.

제공된 코드에서 문제는 다음 테이블 및 저장 프로시저:

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
로그인 후 복사

저장 프로시저의 입력 매개변수와 사용자 테이블의 사용자 이름 열은 기본 데이터 정렬 utf8_general_ci로 선언되고, productUsers 테이블의 권한 열과 rPerm 매개변수는 utf8_unicode_ci 데이터 정렬로 선언됩니다. .

이 문제를 해결하려면 다음과 같은 여러 가지 옵션이 있습니다.

옵션 1: 입력 변수에 COLLATE 추가

COLLATE 절을 입력에 추가 utf8_unicode_ci 데이터 정렬을 명시적으로 지정하기 위한 저장 프로시저 호출의 변수.

$rUsername = 'aname' COLLATE utf8_unicode_ci;
$call = "CALL updateProductUsers(@rUsername, @rProductID, @rPerm);";
로그인 후 복사

옵션 2: COLLATE를 WHERE 절에 추가

COLLATE 절을 WHERE 절에 추가 저장 프로시저 정의에서 users.username 열에 대한 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 COLLATE utf8_unicode_ci
        AND productUsers.productID = rProductID;
END
로그인 후 복사

옵션 3: COLLATE를 IN 매개 변수 정의에 추가

MySQL 버전의 경우 5.7 이전 버전에서는 저장 프로시저 자체의 IN 매개 변수 정의에 COLLATE 절을 추가할 수 있습니다.

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
로그인 후 복사

옵션 4: 테이블 필드 변경

utf8_unicode_ci 데이터 정렬을 사용하려면 사용자 테이블의 사용자 이름 열을 사용하세요.

ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_unicode_ci;
로그인 후 복사

일반적으로 utf8_general_ci가 데이터 정렬 속도가 더 빠르지만 더 넓은 범위의 유니코드 문자를 지원하므로 utf8mb4/utf8mb4_unicode_ci를 사용하는 것이 좋습니다.

위 내용은 MySQL의 \'잘못된 데이터 정렬 혼합\' 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿