使用带有多字节字符的MySQL SELECT WHERE IN

时间:2012-07-03 00:03:17

标签: mysql unicode multibyte

我有一个包含所有已定义的Unicode字符(character列)及其关联的Unicode点(id列)的表。我有以下查询:

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

虽然此查询应仅返回3行(id = 65,66,67),但它会返回129行,包括以下ID:

  

65 66 67 97 98 99 129 141 143 144 157 160 193 205 207 208 221 224 257   269 271 272 285 288 321 333 335 336 349 352 449 461 463 464 477 480   2049 2061 2063 2064 2077 2080 4161 4173 4175 4176 4189 4192 4929 4941   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 13264   13277 13280

我确定这必须与多字节字符有关,但我不知道如何修复它。任何想法在这里发生了什么?

2 个答案:

答案 0 :(得分:4)

字符串相等和顺序由collation管理。默认情况下,使用的排序规则是从列中确定的,但您可以使用the COLLATE clause设置每个查询的排序规则。例如,如果使用charset utf8声明列,则可以使用utf8_bin来使用考虑Aà不同的二进制排序规则:

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

或者您可以使用the BINARY operatorcharacter转换为“二进制字符串”,这会强制使用二进制比较,这几乎只是not quite the same as binary collation

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

更新:我认为以下内容应该是等效的,但不是因为列有lower "coercibility" than the constants。二进制字符串常量将转换为非二进制,然后进行比较。

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

答案 1 :(得分:0)

您可以尝试:

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