Я собираюсь обратиться к части MS SQL Server в этом вопросе, но «правильный» ответ на самом деле зависит от поддерживаемого языка (языков) и приложения.
Когда вы создаете таблицу в SQL Server, каждое текстовое поле имеет неявно или явно заданное сопоставление. Это влияет как на порядок сортировки, так и на поведение сравнения. По умолчанию для большинства английских (США) локалей используется Latin1_General_CI_AS или Latin 1, без учета регистра, с учетом акцента. Это означает, что, например, a = A, но a! = Ä и a! = Ä. Вы также можете использовать нечувствительный к акценту (Latin1_General_CI_AI), который рассматривает все диакритические вариации «A» как равные.
Некоторые локали поддерживают другие категории сравнения; например, французский порядок слов, содержащих диакритические знаки, несколько отличается от немецкого. По-турецки семантически разные точки без точек и я, поэтому я и я не совпадаем даже с нечувствительными к регистру сравнениями, если вы используете турецкую, без учета регистра и с сортировкой.
Вы можете изменить параметры сортировки для каждой базы данных, для каждой таблицы, для каждого поля и, с некоторыми затратами, даже для каждого запроса. Насколько я понимаю, индексы нормализуются в соответствии с указанным порядком сортировки, что означает, что в основном индекс сохраняет сглаженную версию исходной строки. Например, при сортировке без учета регистра Apple и apple хранятся как apple. Запросы перед поиском сводятся с одинаковым сопоставлением.
В японском языке есть еще одна категория нормализации, где символы полной ширины и полуширины, такие как ア = ア, а в некоторых случаях два символа полуширины сведены в один семантически эквивалентный символ (バ = バ). Наконец, для некоторых языков есть еще один шарик воска с составными символами, где отдельные диакритические знаки могут быть составлены с другими символами (например, умлаут в ä - один символ, составленный с простой формой a). Вьетнамский, тайский и некоторые другие языки имеют вариации этой категории. Если есть каноническая форма, нормализация Unicode позволяет составным и разложенным формам рассматриваться как эквивалентные. Нормализация Unicode обычно применяется перед выполнением любых сравнений.
Чтобы подвести итог, для сравнения без учета регистра вы делаете что-то похожее на сравнение строк в диапазоне ASCII: сгладьте левую и правую часть сравнения «в нижний регистр» (например), затем сравните массив в виде двоичного массива. Разница в том, что вам нужно
1) нормализовать строки в той же форме Unicode (KC или KD)
2) нормализовать строки в одном и том же случае в соответствии с правилами этой локали
3) нормализовать акценты в соответствии с правилами чувствительности к акценту
4) сравнить согласно бинарному сравнению
4) если применимо, например, в случае сортировки, сравните, используя дополнительные вторичные и троичные правила сортировки, которые включают в себя вещи, аналогичные таким вещам, как сортировка «Mc» перед «M» в некоторых языках.
И да, Windows хранит таблицы для всех этих правил. Вы не получаете все из них по умолчанию в каждой установке, если только вы не добавили поддержку для них с поддержкой восточноазиатских языков и поддержкой сложных сценариев из панели управления.