source

MySql에서 잘못된 조합 오류입니다.

factcode 2023. 1. 9. 21:14
반응형

MySql에서 잘못된 조합 오류입니다.

방금 전 질문에서 이 답변을 받았는데, 아주 효과적이야!

SELECT username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount 
FROM ratings WHERE month='Aug' GROUP BY username HAVING TheCount > 4
ORDER BY TheAverage DESC, TheCount DESC

그러나 이 추가 비트를 삽입하면 다음과 같은 오류가 발생합니다.

문서 #1267 - 잘못된 조합(latin1_swedish_ci,IMPLICAT) 및 (latin1_general_ci,'=' 작업에 대한 IMPLICATE)

SELECT username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount FROM 
ratings WHERE month='Aug' 
**AND username IN (SELECT username FROM users WHERE gender =1)**
GROUP BY username HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC

표는 다음과 같습니다.

id, username, rating, month

다음은 잘못된 조합인 열을 확인하는 방법입니다.

SELECT table_schema, table_name, column_name, character_set_name, collation_name

FROM information_schema.columns

WHERE collation_name = 'latin1_general_ci'

ORDER BY table_schema, table_name,ordinal_position; 

이를 수정하기 위한 질문은 다음과 같습니다.

ALTER TABLE tbl_name CONVERT TO CHARACTER SET latin1 COLLATE 'latin1_swedish_ci';

링크

각 테이블의 대조 유형을 확인하고 대조 유형이 동일한지 확인합니다.

그 후 조작에 사용하는 각 테이블필드의 대조 유형도 확인합니다.

나는 같은 실수를 겪었고, 그 속임수는 나에게 효과가 있다.

[MySQL]

다음과 같은 경우(매우 드문 경우)

  • 서로 다른 대조 유형을 필요로 하는 두 테이블
  • 테이블에서 오는 것이 아니라 명시적 열거에서 오는 값. 예를 들어 다음과 같습니다.

    1 AS 번호 UNION ALL SELECT 2 UNION ALL SELECT 3

CAST 또는 CONVERT를 사용하여 여러 테이블 간의 값을 비교할 수 있습니다.

CAST('my text' AS CHAR CHARACTER SET utf8)

CONVERT('my text' USING utf8)

MySQL 웹사이트에서 CONVERT 및 CAST 문서를 참조하십시오.

PhpMyadmin에서도 같은 에러가 발생하고 있어, 여기에 제시된 해결 방법을 실행해 주세요.

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

MySQL 오류 조합의 잘못된 혼합 또한 스웨덴어 대신 General을 사용할 것을 권장합니다.이거는 기본이고 어플리케이션이 스웨덴어를 사용하지 않는 한 언어를 사용하지 않는 것이 좋습니다.

utf8로 변환하는 것이 좋을 것 같습니다.

--set utf8 for connection
SET collation_connection = 'utf8_general_ci'
--change CHARACTER SET of DB to utf8
ALTER DATABASE dbName CHARACTER SET utf8 COLLATE utf8_general_ci
--change CHARACTER SET of table to utf8
ALTER TABLE tableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

나도 같은 에러가 발생했지만, 나의 경우 체크하고 있는 파라미터에 알 수 없는 숨겨진 문자(+%A0)가 있는 이 주된 문제였습니다.

A0 변환이 160을 얻었는데 160이 db가 알고 있는 문자의 범위를 벗어났을 때 데이터베이스에서는 다른 문자가 인식되지 않는 이유는 테이블 컬럼이 varchar이기 때문입니다.

  • 내가 한 해결책은 sql 명령어를 실행하기 전에 그런 문자가 몇 개 있는지 확인했습니다.

  • ex:- preg_replace('/\D/', '', $myParameter);

  • users.gender 열이 INTEGER인지 확인합니다.
  • 험::alter table users convert to character set latin1 collate latin1_swedish_ci;

Collation 을 latin1_general_ci에서 latin1_swedish_ci로 변경해야 합니다.

저장 프로시저 내에서 where 절에 동일한 오류가 발생했습니다.이전에 동일한 테이블/컬럼에 의해 로드된 로컬 선언 변수에서 문제가 발생했음을 발견했습니다.

데이터를 단일 문자로 변환하는 것을 해결했습니다.

즉, 이 에러는 MySQL이 대조 설정이 다른2개의 조작을 실행하려고 하기 때문에 발생합니다.설정이 일치하면 에러는 해소됩니다.물론 사용 목적에 따라 데이터베이스에 대한 올바른 설정을 선택해야 합니다.

다음은 매우 일반적인 두 가지 utf8 대조 중 하나를 선택하는 방법에 대한 몇 가지 유용한 조언입니다.utf8_general_ci와 utf8_unicode_ci의 차이점은 무엇입니까?

phpMyAdmin을 사용하는 경우 에러 메시지에 기재되어 있는 표를 참조하여 각 컬럼의 대조 유형을 체크함으로써 이를 체계적으로 수행할 수 있습니다.먼저 데이터베이스 전체의 대조 설정을 확인해야 합니다.phMyAdmin은 이를 알려주고 필요에 따라 변경할 수 있습니다.그러나 각 테이블의 각 열은 고유한 설정을 가질 수 있습니다.보통 이 모든 것이 일치해야 합니다.

작은 데이터베이스에서는 이 작업을 수동으로 수행할 수 있으며, 어떤 경우에도 오류 메시지를 모두 읽을 경우 일반적으로 올바른 위치로 이동합니다.의 하위 테이블이 있는 열의 '구조' 설정도 살펴봐야 합니다.일치하지 않는 조합이 발견되면 쿼리 창을 사용할 필요 없이 phpMyAdmin을 사용하여 직접 변경할 수 있습니다.그런 다음 작업을 다시 시도하십시오.에러가 해소되지 않는 경우는, 계속 찾아보세요!

여기서의 문제는 주로 이 캐스트(field as varchar) 또는 캐스트(fields as date)와 같은 필드를 캐스트하는 것입니다.

이 문제는 다른 조합에 저장하기 때문이 아니라 2진수인 JSON이 열 유형이기 때문입니다.

다음과 같이 수정:

select table.field COLLATE utf8mb4_0900_ai_ci AS fieldName

가능한 경우 ascii_bin을 사용하면 거의 모든 대조와 일치합니다.사용자 이름에는 특수 문자를 사용할 수 있는 경우가 거의 없습니다.

이 문제를 해결하기 위해 구문을 변경하지 않으려면 다음 작업을 수행하십시오.

MySQL을 버전 5.5 이상으로 업데이트합니다.

이것으로 나는 그 문제를 해결했다.

0에서 1로 설정된 필드에 대한 수집 경고에도 동일한 문제가 있습니다.모든 열 집합이 동일했습니다.컬렉션을 다시 변경하려고 하지만 이 문제는 해결되지 않습니다.

마지막으로 필드를 갱신합니다.NULL그 후 1로 업데이트하여 수집 문제를 해결합니다.

바기스토에서 카테고리를 만드는 동안 불법적인 조합이 발생했습니다.다음 명령어(고맙습니다@Quy Le)를 실행하면 문제가 해결되었습니다.

--연결용 utf8 설정

SET collation_connection = 'utf8_general_ci'

--DB의 문자 집합을 utf8로 변경합니다.

ALTER DATABASE dbName CHARACTER SET utf8 COLLATE utf8_general_ci

--카테고리 테이블을 변경합니다.

ALTER TABLE categories CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

ALTER TABLE category_translations CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

내 경우엔 뭔가 이상했다.파일에서 api 키를 읽고 SQL 쿼리를 하는 서버로 보냅니다.문제는 Windows 메모장에 남겨진 BOM 문자이며, 이로 인해 다음과 같은 오류가 발생했습니다.

SQLSTATE[HY000]: 일반 오류: 1267 잘못된 조합(latin1_swedish_ci,IMPLICAT) 및 작업 '='에 대한 (utf8_general_ci,COERCABLE)

방금 지웠는데 다 잘 되더라고요.

각 기능의 모든 파라미터에 대해 'utf8'을 설정해야 합니다.제 경우입니다.

여기에 이미지 설명 입력

SELECT  username, AVG(rating) as TheAverage, COUNT(*) as TheCount
FROM    ratings
        WHERE month='Aug'
        AND username COLLATE latin1_general_ci IN
        (
        SELECT  username
        FROM    users
        WHERE   gender = 1
        )
GROUP BY
        username
HAVING
        TheCount > 4
ORDER BY
        TheAverage DESC, TheCount DESC;

사용 중인 MySQL 버전이 하위 쿼리(4.1+)를 지원하는지 확인하십시오.다음으로 다음과 같은 방법으로 쿼리를 다시 써 볼 수 있습니다.

SELECT ratings.username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount FROM ratings, users 
WHERE ratings.month='Aug' and ratings.username = users.username
AND users.gender = 1
GROUP BY ratings.username
HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC

언급URL : https://stackoverflow.com/questions/1241856/illegal-mix-of-collations-error-in-mysql

반응형