복붙노트

[SQL] 정렬 MySQL의 오류의 불법 혼합

SQL

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

나는이 문제를 해결하기 위해 무엇을 할 수 있습니까? 어떻게 든 문자열을 탈출 할 수 있도록이 오류가 발생하지 않습니다, 또는 내 표는 어떻게 든 인코딩 변경해야하고, 만약 그렇다면, 내가 그것은 변경해야합니까?

해결법

  1. ==============================

    1.

    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은 어떤 합리적인 이유 때로는 거기에 스웨덴어 몰래.

  2. ==============================

    2.당신은 당신의 테이블 인코딩 및 UTF-8로 연결 인코딩을 모두 설정해야합니다 :

    당신은 당신의 테이블 인코딩 및 UTF-8로 연결 인코딩을 모두 설정해야합니다 :

    ALTER TABLE keywords CHARACTER SET UTF8; -- run once
    

    SET NAMES 'UTF8';
    SET CHARACTER SET 'UTF8';
    
  3. ==============================

    3.

    CONVERT(column1 USING utf8)
    

    내 문제를 해결합니다. 어디, 컬럼 날이 오류를 제공하는 열입니다.

  4. ==============================

    4.오류 다음 문을 사용하여

    오류 다음 문을 사용하여

    데이터가 테이블에있는 경우 데이터 걸릴 백업에 대한주의하십시오.

     ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
  5. ==============================

    5.일반적으로 가장 좋은 방법은 테이블 데이터 정렬을 변경하는 것입니다. 그러나 나는 이전 응용 프로그램이 정말이 부작용이 있는지 여부 결과를 예상 할 수 없습니다. 그러므로 나는 데이터 정렬 문제를 해결 다른 형식으로 문자열을 변환하기 위해 어떻게 든 노력했다. 내가 작업을 발견하는 것은 그것의 문자의 16 진수 표현으로 문자열을 변환하여 비교 문자열을하는 것입니다. 데이터베이스에이 HEX (열)로 이루어집니다. PHP를 들어이 기능을 사용할 수 있습니다 :

    일반적으로 가장 좋은 방법은 테이블 데이터 정렬을 변경하는 것입니다. 그러나 나는 이전 응용 프로그램이 정말이 부작용이 있는지 여부 결과를 예상 할 수 없습니다. 그러므로 나는 데이터 정렬 문제를 해결 다른 형식으로 문자열을 변환하기 위해 어떻게 든 노력했다. 내가 작업을 발견하는 것은 그것의 문자의 16 진수 표현으로 문자열을 변환하여 비교 문자열을하는 것입니다. 데이터베이스에이 HEX (열)로 이루어집니다. 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 문자열이있는 ISO 문자열로 먼저 변환해야 DB에서 사용하기 전에 (예를 들어, PHP에서 utf8_decode ()를 사용하여). 때문에 정렬 유형의 데이터베이스는이 원래 문자열 (A의 ISO 캐릭터 세트 결과에 existend하지? 또는이 완전히 제거 변환 UTF8 문자를) 변경 불구하고 comparism 이벤트를 작동해야하므로 내부 UTF8 문자를 가질 수 없습니다. 그냥 확인 당신이 ISO 변환 같은 UTF8을 사용하는 데이터베이스에 데이터를 쓸 때.

  6. ==============================

    6.내 표는 원래 CHARSET = 라틴어로 생성했다. UTF8로 테이블 변환 후 일부 열은 정말 분명 아니었다 그러나, 변환되지 않았다. 당신은 SHOW는 my_table 테이블을 만들 실행하려고 할 수 있습니다; 및 변환되지 않은 열을 참조하거나 아래의 쿼리에 문제가 열에 잘못된 문자 집합을 수정 (변경 VARCHAR 길이와 문자 집합 및 COLLATE 필요에 따라) :

    내 표는 원래 CHARSET = 라틴어로 생성했다. UTF8로 테이블 변환 후 일부 열은 정말 분명 아니었다 그러나, 변환되지 않았다. 당신은 SHOW는 my_table 테이블을 만들 실행하려고 할 수 있습니다; 및 변환되지 않은 열을 참조하거나 아래의 쿼리에 문제가 열에 잘못된 문자 집합을 수정 (변경 VARCHAR 길이와 문자 집합 및 COLLATE 필요에 따라) :

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

    7.상단의 대답에 나열된 수정을 한 후, 서버의 기본 설정을 변경합니다.

    상단의 대답에 나열된 수정을 한 후, 서버의 기본 설정을 변경합니다.

    당신의 "/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

  8. ==============================

    8.UTF8로 테이블의 문자 집합을 변경

    UTF8로 테이블의 문자 집합을 변경

  9. ==============================

    9.그 사용 캐스트 () 나를 위해 최고의 솔루션이었다 발견 :

    그 사용 캐스트 () 나를 위해 최고의 솔루션이었다 발견 :

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

    개종자 () 함수도 있습니다. 여기에 대한 자세한 내용

    여기에 또 다른 자원

  10. from https://stackoverflow.com/questions/1008287/illegal-mix-of-collations-mysql-error by cc-by-sa and MIT license