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
'source' 카테고리의 다른 글
PDO 연결 닫기 (0) | 2023.01.15 |
---|---|
GROUP BY 및 ORDER BY를 사용한 MySQL 및 MariaDB의 다른 결과 세트 (0) | 2023.01.09 |
MySQL 설정 및 Dockerfile 내 덤프 가져오기 (0) | 2023.01.09 |
빈 어레이 항목을 건너뛰면서 어레이를 삽입하려면 어떻게 해야 합니까? (0) | 2023.01.09 |
SQL 키(MUL vs PRI vs UNI) (0) | 2023.01.09 |