Как диапазон с двоичным сопоставлением сопоставления (изменения) символов за пределами диапазона - PullRequest
0 голосов
/ 10 января 2020

(Фактическая проблема, кажется, указана c, но присущие проблемы могут быть обобщены относительно сопоставления, LIKE и Unicode.)

В T- SQL, я тестирую для суррогатных латинских алфавитов (например, вложенный Alphanumeri c дополнение ), например, так:

IF N'Hi??‍♂️' LIKE N'%[?-?]%' COLLATE Latin1_General_BIN2 PRINT 'Match'; -- why‽

Естественно, кажущиеся единичные эмодзи появляются только как таковые (что не должно быть проблемой) вообще):

[...'??‍♂️'].map(c=>'U+'+c.codePointAt(0).toString(16)).join(', ').toUpperCase(); // in JavaScript

Я обнаружил, что модификатор ? U+1F3FB (127995) вызывает такое неожиданное поведение в тестовой строке, хотя диапазон ?-? должен быть эквивалентен 127248–127487 с модификатором (127995), конечно, за пределами этого диапазона.

Кроме того, я не могу понять, почему региональные индикаторы из этого блока могут вести себя по-разному в чистых сравнениях по коду:

IF N'?' LIKE N'%[?-?]%' COLLATE Latin1_General_BIN2 PRINT 'Match'; -- ?-? = U+1F1E6 (127462) – U+1F1FF (127487)

Аналогично неожиданно, поскольку при LIKE и при «поисках по диапазону символы, включенные в диапазон, могут различаться в зависимости от правил сортировки параметров сортировки» . Это подходит для использования двоичного сопоставления , потому что оно реализует «чистое сравнение кодовых точек» .

Это ограничение сопоставления или диапазонов? По-разному ли обрабатываются региональные индикаторы или модификаторы эмодзи (т. Е. Объединение символов не пересекается)?

...