0

定義済みのすべての Unicode 文字 (character列) とそれに関連付けられた Unicode ポイント (id列) の表があります。次のクエリがあります。

SELECT id FROM unicode WHERE `character` IN ('A', 'B', 'C')

このクエリは 3 行 (id = 65、66、67) のみを返す必要がありますが、代わりに次の ID を含む 129 行を返します。

65 66 67 97 98 99 129 141 143 144 157 160 193 205 205 207 208 224 257 269 271 272 285 288 321 333 335 336 349 352 449 4943 4944 4957 4960 5057 5069 5071 5072 5085 5088 5121 5133 5135 5136 5149 5152 5953 5965 5967 5968 5984 6145 6157 6160 6176 8257 8269 8271 8272 8285 8288 9025 9037 9039 9040 9053 9056 9153 9165 9167 9168 9181 9184 9217 9229 9231 9232 9245 9248 10049 10061 10063 10064 10077 10080 10241 10253 10255 10256 10269 10272 12353 12365 12367 12368 12381 12384 13121 13133 13135 13136 13149 13152 13249 13261 13263 13263 13264 13277

これはマルチバイト文字と関係があるに違いないと確信していますが、修正方法がわかりません。ここで何が起こっているのですか?

4

2 に答える 2

4

文字列の等価性と順序は照合によって管理されます。デフォルトでは、使用される照合は列から決定されますがCOLLATEを使用してクエリごとに照合を設定できます。たとえば、列が charset utf8 で宣言されている場合、次のようutf8_binに考慮するバイナリ照合順序を使用Aできますà

SELECT id FROM unicode WHERE `character` COLLATE utf8_bin IN ('A', 'B', 'C')

または、BINARY演算子characterを使用して「バイナリ文字列」に変換することもできます。これにより、バイナリ比較の使用が強制されます。これは、バイナリ照合とほとんど同じではありませんが、まったく同じではありません。

SELECT id FROM unicode WHERE BINARY `character` IN ('A', 'B', 'C')

更新:以下は同等であると考えましたが、列の「強制力」が定数よりも低いためではありません。バイナリ文字列定数は、非バイナリに変換されてから比較されます。

SELECT id FROM unicode WHERE `character` IN (_binary'A', _binary'B', _binary'C')
于 2012-07-03T06:14:56.333 に答える
0

あなたが試すことができます:

SELECT id FROM unicode WHERE 'character' IN (_utf8'A',_utf8'B',_utf8'C')
于 2012-07-03T00:22:57.367 に答える