0

我有一个包含所有已定义 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 1006110253 10272 12353 1236512381 12313131241132713271327132711327132713271327132713271327132713271327113271327132713271327113271327132713271327113271327113132711313261321327132711327132613513260

我确定这一定与多字节字符有关,但我不知道如何解决它。有什么想法吗?

4

2 回答 2

4

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

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

或者,您可以使用运算符转换BINARYcharacter强制使用二进制比较的“二进制字符串”,这与二进制排序规则几乎但不完全相同

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

更新:我认为以下应该是等价的,但这并不是因为列的“强制力”低于 constants。二进制字符串常量将被转换为非二进制,然后进行比较。

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 回答