잘못된 조합 혼합입니다(utf8_unicode_ci,IMPLICAT) 및 (utf8_general_ci,'=' 작업에 대한 IMPLICATE)
MySql 오류 메시지:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
저는 다른 게시물을 여러 번 검토했지만 이 문제를 해결할 수 없었습니다.영향을 받는 부분은 다음과 같습니다.
CREATE TABLE users (
userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
firstName VARCHAR(24) NOT NULL,
lastName VARCHAR(24) NOT NULL,
username VARCHAR(24) NOT NULL,
password VARCHAR(40) NOT NULL,
PRIMARY KEY (userid)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE products (
productID INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(104) NOT NULL,
picturePath VARCHAR(104) NULL,
pictureThumb VARCHAR(104) NULL,
creationDate DATE NOT NULL,
closeDate DATE NULL,
deleteDate DATE NULL,
varPath VARCHAR(104) NULL,
isPublic TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
PRIMARY KEY (productID)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE productUsers (
productID INT UNSIGNED NOT NULL,
userID INT UNSIGNED NOT NULL,
permission VARCHAR(16) NOT NULL,
PRIMARY KEY (productID,userID),
FOREIGN KEY (productID) REFERENCES products (productID) ON DELETE RESTRICT ON UPDATE NO ACTION,
FOREIGN KEY (userID) REFERENCES users (userID) ON DELETE RESTRICT ON UPDATE NO ACTION
) 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
php로 테스트하고 있었는데 SQLyog에서도 같은 에러가 발생하였습니다.DB 전체를 재작성하는 테스트도 해봤지만 잘 되지 않았습니다.
어떤 도움이라도 주시면 대단히 감사하겠습니다.
은 " " " " 입니다.utf8_general_ci
조합은 혼재할 수 없기 때문에, 다음의 4개의 옵션이 있습니다.
옵션 1: 추가COLLATE
력력: :
SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added
CALL updateProductUsers(@rUsername, @rProductID, @rPerm);
옵션 2: 추가COLLATE
WHERE
§:
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 -- COLLATE added
AND productUsers.productID = rProductID;
END
옵션 3: 에 추가IN
MySQL 5.7 이 :
CREATE PROCEDURE updateProductUsers(
IN rUsername VARCHAR(24) COLLATE utf8_unicode_ci, -- COLLATE added
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: 필드 자체를 변경합니다.
ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci;
유니코드 순서로 데이터를 정렬할 필요가 없는 한, 모든 테이블을 변경할 것을 권장합니다. utf8_general_ci
코드 변경이 필요 없고 속도도 약간 올라갑니다.
업데이트: 현재 utf8mb4/utf8mb4_unicode_ci가 선호되는 문자 집합/조합 방식이 되었습니다.utf8_general_ci는 퍼포먼스 향상이 거의 없기 때문에 권장되지 않습니다.https://stackoverflow.com/a/766996/1432614 를 참조해 주세요.
반나절 동안 utf8_unicode_ci와 utf8_general_ci 사이의 경합과 동일한 "불법 조합" 오류에 대한 답을 검색했습니다.
데이터베이스 내의 일부 컬럼이 utf8_unicode_ci와 특별히 대조되지 않은 것을 발견했습니다.mysql은 이들 컬럼 utf8_general_ci를 암묵적으로 조합한 것으로 보입니다.
구체적으로는 'SHOW CREATE TABLE 1' 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
| table1 | CREATE TABLE `table1` (
`id` int(11) NOT NULL,
`col1` varchar(4) CHARACTER SET utf8 NOT NULL,
`col2` int(11) NOT NULL,
PRIMARY KEY (`col1`,`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
'col1' varchar(4) CHARTER SET utf8 NOT NULL 행에는 조회가 지정되어 있지 않습니다.그런 다음 다음 쿼리를 실행했습니다.
ALTER TABLE table1 CHANGE col1 col1 VARCHAR(4) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
이것으로 "불법 조합" 오류가 해결되었습니다.이게 다른 사람에게 도움이 되길 바라.
저도 비슷한 문제가 있었습니다만, 예를 들어 변수를 사용하여 쿼리 파라미터를 설정했을 때 프로시저 내부에서 문제가 발생했습니다. SET @value='foo'
.
였습니다.collation_connection
및 데이터베이스 대조..collation_connection
collation_database
문제는 사라졌습니다.paramparam/value 에 COLATE를 보다 더 합니다.
약하: 모든모모모모모모모모모모합합합합합.SHOW VARIABLES
꼭 해 주세요.collation_connection
★★★★★★★★★★★★★★★★★」collation_database
match를 사용한 테이블 합니다).SHOW TABLE STATUS [table_name]
를 참조해 주세요.
@answer와 @bpile answer @bpile 입니다.collation-server = utf8_general_ci
그것을 깨달은 후(그리고 위의 모든 것을 시도한 후) 강제로 데이터베이스를 utf8_unicode_ci가 아닌 utf8_general_ci로 전환하면 끝입니다.
ALTER DATABASE `db` CHARACTER SET utf8 COLLATE utf8_general_ci;
정답은 @Sebas의 답변에 추가되는 것입니다. 즉, 로컬 환경을 조합하는 설정입니다.실가동 시에는 사용하지 마십시오.
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
이 솔루션의 소스
내 경우 다음과 같은 오류가 있습니다.
잘못된 조합 혼합입니다(utf8_general_ci,IMPLICAT) 및 (utf8_unicode_ci,'=' 작업에 대한 IMPLICATE)
$this->db->select("users.username as matric_no, CONCAT(users))를 선택합니다.성, ', users.first_name, ', users.last_name)을 풀네임으로 지정), 'users.users.users.users.matric_no', 'left'를 지정합니다.session_id', $dep) ->where classroomclassroom _ spec . level _ id 、 $level ) ->where classroomclassroom _ spec . dept _ id 、 $dep ) ;
몇 주 동안 구글을 검색한 결과 비교하고 있는 두 개의 필드가 서로 다른 조합 이름으로 구성되어 있다는 것을 알게 되었습니다.첫 번째 username은 utf8_general_ci이고 두 번째 username은 utf8_unicode_ci이기 때문에 두 번째 테이블 구조로 돌아가서 두 번째 필드(matric_no)를 utf8_general_ci로 변경했습니다.이 매우 효과적입니다.
같은 문제(1, 2, 3, 4)에 대해 수많은 질문을 찾았지만, 여기서도 퍼포먼스를 고려한 답을 찾지 못했습니다.
이미 여러 개의 솔루션이 제공되었지만 성능 고려를 하고 싶습니다.
편집: Manatax 님의 지적에 감사드립니다.옵션 1은 퍼포먼스 문제가 없습니다.
옵션 1과 2(COLATE 캐스트 어프로치)를 사용하면 컬럼에 정의된 인덱스가 사용되지 않아 전체 스캔이 발생하기 때문에 잠재적인 병목 현상이 발생할 수 있습니다.
Option 3을 사용해 본 적은 없지만, Option 1과 Option 2의 결과는 같을 것 같습니다.
마지막으로 실행 가능한 매우 큰 테이블에는 옵션4가 최적입니다.즉, 원래의 대조법에 의존하는 다른 용도는 없습니다.
다음과 같은 간단한 쿼리를 고려하십시오.
SELECT
*
FROM
schema1.table1 AS T1
LEFT JOIN
schema2.table2 AS T2 ON T2.CUI = T1.CUI
WHERE
T1.cui IN ('C0271662' , 'C2919021')
;
원래 예에서는 가입자가 더 많았습니다.물론 table1과 table2의 조합은 다릅니다.collate 연산자를 사용하여 캐스트하면 인덱스가 사용되지 않게 됩니다.
아래 그림의 sql 설명을 참조하십시오.
반면 옵션 4는 가능한 인덱스를 활용할 수 있어 빠른 쿼리로 이어질 수 있습니다.
아래 그림에서는 스키마/테이블/컬럼 조회를 변경하는 옵션4를 적용한 후 동일한 쿼리를 실행하는 것을 볼 수 있습니다.
조합이 변경되었으므로 조합 캐스트를 사용하지 않는 시각적 쿼리 설명
결론적으로 퍼포먼스가 중요하고 테이블 조회를 변경할 수 있는 경우 옵션4로 넘어갑니다단일 열에 대해 작업해야 하는 경우 다음과 같은 기능을 사용할 수 있습니다.
ALTER TABLE schema1.table1 MODIFY `field` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
이 문제는 컬럼이 명시적으로 다른 대조로 설정되어 있거나 쿼리된 테이블에서 기본 조회가 다른 경우에 발생합니다.
다수의 테이블이 있는 경우 다음 쿼리를 실행할 때 데이터 정렬을 변경할 수 있습니다.
select concat('ALTER TABLE ', t.table_name , ' CONVERT TO CHARACTER
SET utf8 COLLATE utf8_unicode_ci;') from (SELECT table_name FROM
information_schema.tables where table_schema='SCHRMA') t;
모든 테이블을 열별로 올바른 데이터 정렬을 사용하도록 변환하는 데 필요한 쿼리를 출력합니다.
Larabel에서 MySql Database에서 Excels 파일을 업로드하는 동안 문제가 발생했습니다.Excel 파일에서 일부 주소에는 오류가 발생한 PeterOs와 같은 문자가 포함되어 있습니다.
SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8mb4_unicode_ci,COERCIBLE) for operation '=' (SQL: select count(*) as aggregate from `.....` where `e....` = kas@email.com and `first_name` = Gill and `surname` = Harries and `address` = 6 St.PeterÕs Close,,,Woodbridge,Suffolk,IP12 4EJ and `status` = 1 and `client`.`deleted_at` is null)
저는 위에서 언급한 많은 솔루션을 시도하지만 안타깝게도 아무도 저를 위해 일하지 않기 때문에 저에게 맞는 솔루션을 게시합니다.그래서 경우에 따라서는 작동하지 않을 수도 있습니다.예외는 다를 수 있습니다.그래서 그걸 통해서 해결책을 찾아야 되고 이게 도움이 된다고 생각하시는 분들이 있으면 투표해 주세요.
나는 두 가지 종류의 해결책을 시도한다.
- select() 쿼리 실행 중 오류가 발생하여 처리를 위해 try{} Catch() 블록에 특별한 코드를 넣었습니다.이것에 TRY{}를 사용합니다.데이터베이스에 저장된 업로드된 레코드를 사용합니다.그러나 charset 발행이 그 장소에 있을 때 발행된다.샘플 이미지는 다음과 같습니다.
- 작동 중에 문제가 발생하는 문자 집합을 감지하고 이 코드로 MySql 구성을 변경할 수 있습니다.
\Config::set('database.connections.mysql.charset', 'latin1');
\Config::set('database.connections.mysql.collation', 'latin1_bin');
\DB::purge('mysql');
두 솔루션 모두 효과가 있습니다.
언급URL : https://stackoverflow.com/questions/11770074/illegal-mix-of-collations-utf8-unicode-ci-implicit-and-utf8-general-ci-implic
'programing' 카테고리의 다른 글
하위 구성 요소의 VueJs 호출 메서드 (0) | 2022.12.11 |
---|---|
Eclipse 가져오기의 주요 바로 가기 (0) | 2022.12.11 |
MySql: 'SUM IF' 또는 'COUNT IF'가 가능합니까? (0) | 2022.12.11 |
BOM을 사용하여 UTF-8 파일을 검색하는 우아한 방법? (0) | 2022.12.11 |
mocha의 기본 시간 초과 변경 (0) | 2022.12.11 |