데이터 정렬의 잘못된 조합 MySQL 오류


124

많은 데이터를 처리하는 동안이 이상한 오류가 발생합니다.

Error Number: 1267

Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

이 문제를 해결하려면 어떻게해야합니까? 이 오류가 발생하지 않도록 어떻게 든 문자열을 이스케이프 할 수 있습니까? 아니면 어떻게 든 테이블 인코딩을 변경해야합니까? 그렇다면 어떻게 변경해야합니까?


이 오류는 주사 가능한가요?
hamza irizaj

1
이것이 귀하의 질문에 대답합니까? MySql의 잘못된 데이터 정렬 오류
Farhan

답변:


288
SET collation_connection = 'utf8_general_ci';

그런 다음 데이터베이스

ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

MySQL은 때때로 합리적인 이유없이 스웨덴어를 몰래 넣습니다.


3
@Ben : 직접 복사하여 붙여 넣을 수있는 솔루션을 제공해 주셔서 감사합니다. 많은 시간을 절약했습니다.
Pistos

15
@ 벤 : 그것은 처음 스웨덴 회사에 의해 개발되었다 ... 즉, 짜증나는 latin1_swedish_ci 초기 설정 뒤에 이유입니다 .. :(
Vajk Hermecz

1
내가 처음 문을 수행 할 수있는 권한을 가지고 있지 않았지만 그냥 테이블을하고 일했다
롭 윅

이것을 위해 당신을 사랑하십시오! : P
prateekkathal

이것은 많은 사람들에게 작동하는 것처럼 보이지만 불행히도이 스레드에서 모든 장치를 시도한 후에도 여전히이 문제가 있습니다. 내 데이터베이스 기본 데이터 정렬은 'ucs2_bin'에서 변경하는 것을 고집스럽게 거부하므로 모든 테이블과 연결 데이터 정렬을 'usc2_bin'으로 변경하려고 시도했지만 "SQL 오류 (1267) : 잘못된 데이터 정렬 조합 (utf8_general_ci, IMPLICIT)"오류가 발생합니다. (ucs2_bin, IMPLICIT) 작업 '=' ".
bikeman868

15

테이블 인코딩과 연결 인코딩을 모두 다음과 같이 설정해야합니다 UTF-8.

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';

이 두 가지가 모두 필요합니까? 아니면 둘 중 하나만 수행 할 수 있습니까?
클릭 Upvote

ALTER DATABASE myDbDEFAULT CHARACTER SET utf8 COLLATE utf8_bin. 작동할까요? 이 작업은 테이블 중 하나뿐 아니라 모든 테이블에 영향을 미치도록 수행되었습니다.
Click Upvote

1
ALTER DATABASE는 현재 테이블 설정을 변경하지 않고 새로 생성 된 설정 만 변경합니다. 데이터베이스에 대한 기본 문자 집합을 변경하는 것도 문제가되지 않습니다.
Quassnoi

SET NAMES 및 SET CHARACTER SET은 연결 인코딩을 변경합니다. 연결할 때마다 이러한 명령을 실행해야합니다. 클라이언트 라이브러리는 더 우아한 방법을 지원할 수 있습니다 (php :: mysqli는 지원하지만 php :: mysql은 지원하지 않음).
Quassnoi

지금은 작동하는 것 같습니다. 몇 가지 테스트 후 수락하겠습니다. 두 번째 쿼리는 한 번 실행해야합니까, 아니면 각 스크립트 시작시에 실행해야합니까?
Upvote 클릭

13
CONVERT(column1 USING utf8)

내 문제를 해결합니다. 여기서 column1은이 오류를 제공하는 열입니다.


나를 위해 이것은 효과가 있었다 : CONVERT ( "column1"USING LATIN1)
shasi kanth

4

오류에 대해 다음 문을 사용하십시오.

데이터가 테이블에 있으면 데이터 백업에주의하십시오.

 ALTER TABLE your_table_name 문자 집합으로 변환 utf8 COLLATE utf8_general_ci;

2

일반적으로 가장 좋은 방법은 테이블 데이터 정렬을 변경하는 것입니다. 그러나 나는 오래된 응용 프로그램을 가지고 있으며 이것이 부작용이 있는지 여부를 실제로 예측할 수 없습니다. 따라서 어떻게 든 문자열을 데이터 정렬 문제를 해결하는 다른 형식으로 변환하려고 시도했습니다. 내가 찾은 것은 문자열을 문자의 16 진수 표현으로 변환하여 문자열 비교를 수행하는 것입니다. 데이터베이스에서 이것은 HEX(column).PHP의 경우 다음 기능을 사용할 수 있습니다.

public static function strToHex($string)
{
    $hex = '';
    for ($i=0; $i<strlen($string); $i++){
        $ord = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex .= substr('0'.$hexCode, -2);
    }
    return strToUpper($hex);
}

데이터베이스 쿼리를 수행 할 때 원래 UTF8 문자열을 utf8_decode()DB에서 사용하기 전에 먼저 iso 문자열 (예 : PHP에서 사용)로 변환해야합니다 . 데이터 정렬 유형으로 인해 데이터베이스 내부에 UTF8 문자가있을 수 없으므로 원래 문자열이 변경 되더라도 비교가 작동해야합니다 (존재하지 않는 UTF8 문자 변환은?로 끝나거나 완전히 제거됨). 데이터베이스에 데이터를 쓸 때 동일한 UTF8에서 ISO로 변환을 사용하는지 확인하십시오.


2

원래 CHARSET = latin1으로 만든 테이블이 있습니다. 테이블을 utf8로 변환 한 후 일부 열이 변환되지 않았지만 실제로는 명확하지 않았습니다. 실행을 시도하고 SHOW CREATE TABLE my_table;어떤 열이 변환되지 않았는지 확인하거나 아래 쿼리를 사용하여 문제가있는 열에서 잘못된 문자 집합을 수정할 수 있습니다 (필요에 따라 varchar 길이와 CHARSET 및 COLLATE 변경).

 ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8 
 COLLATE utf8_general_ci NULL;


0

상위 답변에 나열된 수정을 한 후 서버의 기본 설정을 변경하십시오.

" /etc/my.cnf.d/server.cnf "또는 그 위치에 [mysqld] 섹션에 기본값을 추가하여 다음과 같이 보이게합니다.

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

출처 : https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html


0

사용 cast()하는 것이 나에게 가장 적합한 솔루션 이라는 것을 알았 습니다.

cast(Format(amount, "Standard") AS CHAR CHARACTER SET utf8) AS Amount

convert()기능 도 있습니다. 여기 에 대한 자세한 내용

여기에 또 다른 리소스


0

이 솔루션에서 제안한대로 내 사용자 계정에는 데이터베이스 및 테이블을 변경할 수있는 권한이 없습니다 .

저처럼 문자 조합에 신경 쓰지 않는다면 ( '='연산자를 사용하는 경우) 역방향 수정을 적용 할 수 있습니다. SELECT 전에 이것을 실행하십시오.

SET collation_connection = 'latin1_swedish_ci';
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.