異なるvarchar列に異なる照合を使用して文字列を格納し、SQLクエリでそのような列を複数使用すると、SQLクエリで「照合の無効な組み合わせ」というエラーがスローされる場合があります。(たとえば、互換性のない照合の2つの文字列を比較する場合、または異なる照合のデータを組み合わせた列に選択しようとする場合)。
ただし、クエリで「COLLATE」を指定すれば修正できます。例:
WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_ci
しかし、これはあなたが持っているかもしれないどんなINDEXも打ち負かします。
「照合の無効な組み合わせ」エラーを防ぐために、varbinaryを使用できます。
varchar列にマルチバイト照合が使用されている場合、varbinaryはvarcharよりも少ないスペースを使用します。(バイナリ文字列には文字セットと照合がありません。バイナリ文字列は単なるバイト値のシーケンスです)。
***ところで、文字セットは記号とエンコーディングのセットです。照合は、文字セットhttps://dev.mysql.com/doc/refman/5.7/en/charset-general.html内の文字を比較するための一連のルールです。
ただし、マルチバイト文字セット(ex、utf8、またはucs2)ではなくシングルバイト文字セット(ex、latin1)を選択した場合、varbinaryとvarcharの両方のスペース要件は同じです。
妥当性チェックがない場合、VARBINARYはVARCHARよりも優れています。たとえば、デフォルトの文字セットがUTF8の場合、これは不正です。
CREATE TABLE t9 (s1 VARCHAR(5));
INSERT INTO t9 VALUES (0xF4808283);
ただし、文字セットは重要ではないため、これは合法です。
CREATE TABLE t10 (s1 VARBINARY(5));
INSERT INTO t10 VALUES (0xF4808283);
したがって、VARCHARは「照合」とVARBINARY比較バイトを使用して文字を比較します。ほとんどの照合では「大文字と小文字を区別しない」ため、大文字と小文字は同じと見なされます。varbinaryは照合を使用しないため、varbinaryの場合、検索操作では常に大文字と小文字が区別されます。