web-dev-qa-db-ja.com

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、IMPLICIT)と(latin1_general_ci、IMPLICIT)の違法な組み合わせ

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

40
Oliver

各テーブルの照合タイプを確認し、それらが同じ照合を持っていることを確認してください。

その後、操作で使用する各テーブルフィールドの照合タイプも確認します。

私は同じエラーに遭遇しました、そして、そのトリックは私に働きます。

17
1mr3yn

どの列が間違った照合であるかを確認する方法は次のとおりです。

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';

リンク

79
Dean Rather

[MySQL]

これらの(非常にまれな)場合:

  • 本当に異なる照合タイプが必要な2つのテーブル
  • たとえば、テーブルからではなく、明示的な列挙からの値:

    SELECT 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 Webサイトの CONVERTおよびCASTドキュメント を参照してください。

14
RotS

私はPhpMyadminで同じエラーを受け取っていましたが、ここで示された解決策を実行しました

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

照合エラーの不正な組み合わせMySQLエラー また、スウェーデン語を使用する場合を除き、一般的な言語を使用することをお勧めします。

5
pal4life

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
2
Quy Le
  • Users.gender列がINTEGERであることを確認してください。
  • 試してください:alter table users convert to character set latin1 collate latin1_swedish_ci;
1
hobodave

ストアドプロシージャ内のwhere句で同じエラーが発生しました。同じテーブル/列によって以前にロードされたローカル宣言変数で問題が発生することを発見しました。

データを単一のchar型にキャストすることを解決しました。

1
Roberto Camargo

ここでの問題は、主に、このcast(field as varchar)またはcast(fields as date)のようにフィールドをキャストするだけです

1
reds

要するに、このエラーは、MySQLが照合設定が異なる2つの操作を実行しようとしたために発生します。設定を一致させると、エラーはなくなります。もちろん、データベースの用途に応じて、データベースに適切な設定を選択する必要があります。

2つの非常に一般的なutf8照合順序の選択に関するいくつかの良いアドバイスを次に示します。 tf8_general_ciとutf8_unicode_ciの違いは何ですか

PhpMyAdminを使用している場合、エラーメッセージに記載されている表を操作し、各列の照合タイプを確認することで、体系的にこれを行うことができます。まず、データベースの全体的な照合設定がどれであるかを確認する必要があります-phpMyAdminはこれを通知し、必要に応じて変更できます。ただし、各テーブルの各列には独自の設定を設定できます。通常、これらすべてを一致させる必要があります。

小さなデータベースでは、これは手作業で行うのに十分簡単であり、いずれにしても、エラーメッセージを完全に読んだ場合、通常は適切な場所を指し示します。サブテーブルを含む列の「構造」設定も忘れずに確認してください。一致しない照合が見つかった場合、phpMyAdminを直接使用して変更できます。クエリウィンドウを使用する必要はありません。その後、操作を再試行してください。エラーが解決しない場合は、探し続けてください!

1
Pinkeye

各列照合をlatin1_general_ciからlatin1_swedish_ciに変更する必要があります

1
Swadesh

私も同じエラーを受け取りましたが、私の場合、主な問題はwhereにあり、チェックしているパラメーターに不明な隠し文字がありました(+%A

A0変換すると160を得たが、160はdbが認識している文字の範囲外であったため、データベースは認識できない文字として他のものは私のテーブルの列はvarcharです

  • 私がやった解決策は、そのような文字がいくつかあることを確認し、sqlコマンドを実行する前にそれらを削除することでした

  • 例:-preg_replace( '/\D /'、 ''、$ myParameter);

1
kaushi

可能な限りascii_binを使用すると、ほぼすべての照合と一致します。とにかく、ユーザー名が特殊文字を受け入れることはめったにありません。

0
Kjeld Flarup

0から1に設定されたフィールドのコレクション警告についても同じ問題があります。すべての列コレクションは同じでした。コレクションを再度変更しようとしますが、この問題を解決するものはありません。

最後に、フィールドをNULLに更新し、その後1に更新すると、コレクションの問題が解決します。

0
gskillz
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;
0
Quassnoi

各関数のすべてのパラメーターに「utf8」を設定する必要があります。それは私の場合です:

ここに画像の説明を入力

0
Nhung Phan

この問題を解決するために構文の変更を避けたい場合は、これを試してください:

MySQLをバージョン5.5以降に更新します。

これで問題は解決しました。

0
HoldOffHunger