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

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

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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

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



답변

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은 때때로 합리적인 이유없이 스웨덴어를 몰래 넣습니다.


답변

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

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

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


답변

CONVERT(column1 USING utf8)

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


답변

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

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

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


답변

일반적으로 가장 좋은 방법은 테이블 데이터 정렬을 변경하는 것입니다. 그러나 나는 오래된 응용 프로그램을 가지고 있으며 이것이 부작용이 있는지 여부를 실제로 예측할 수 없습니다. 따라서 어떻게 든 문자열을 데이터 정렬 문제를 해결하는 다른 형식으로 변환하려고 시도했습니다. 내가 찾은 것은 문자열을 문자의 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로 변환을 사용하는지 확인하십시오.


답변

원래 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;


답변

테이블의 문자 세트를 utf8로 변경하십시오.

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8