Почему оракул чувствителен к регистру? - PullRequest
41 голосов
/ 15 сентября 2011

Есть ли причина, по которой Oracle чувствителен к регистру, а другие, такие как SQL Server и MySQL, не по умолчанию?

Я знаю, что есть способы включить / отключить чувствительность к регистру,но кажется странным, что оракул отличается от других баз данных.

Я также пытаюсь понять причины чувствительности к регистру.Я могу видеть, где «Таблица» и «TaBlE» могут считаться эквивалентными, а не эквивалентными, но есть ли пример, когда чувствительность к регистру на самом деле будет иметь значение?класс.

Ответы [ 5 ]

67 голосов
/ 15 сентября 2011

По умолчанию идентификаторы Oracle (имена таблиц, имена столбцов и т. Д.) Регистро- нечувствительны . Вы можете сделать их чувствительными к регистру, используя кавычки вокруг них (например: SELECT * FROM "My_Table" WHERE "my_field" = 1). Ключевые слова SQL (SELECT, WHERE, JOIN и т. Д.) Всегда не чувствительны к регистру.

С другой стороны, сравнения строк чувствительны к регистру (например: WHERE field='STRING' будет соответствовать столбцам только там, где 'STRING') по умолчанию. Вы можете сделать их без учета регистра, установив для NLS_COMP и NLS_SORT соответствующие значения (например, LINGUISTIC и BINARY_CI соответственно).

Примечание. При запросе представлений словаря данных (например, dba_tables) имена будут в верхнем регистре, если вы создали их без кавычек, и здесь будут применяться правила сравнения строк, описанные во втором абзаце.

В некоторых базах данных (Oracle, IBM DB2, PostgreSQL и т. Д.) Сравнения строк по умолчанию выполняются с учетом регистра, в других - без учета регистра (SQL Server, MySQL, SQLite). Это ни в коем случае не является стандартным, так что просто знайте, каковы ваши настройки БД.

7 голосов
/ 23 сентября 2011

Oracle фактически обрабатывает имена полей и таблиц без учета регистра, если только вы не используете кавычки вокруг идентификаторов. Если вы создадите таблицу без кавычек вокруг имени, например, CREATE MyTable ..., полученное имя таблицы будет преобразовано в верхний регистр (т.е. MYTABLE) и будет обрабатываться без учета регистра. SELECT * из MYTABLE, SELECT * из MyTable, SELECT * из myTabLe будут соответствовать MYTABLE (обратите внимание на отсутствие кавычек вокруг имени таблицы). Вот хорошая статья по этому вопросу , которая более подробно обсуждает эту проблему и сравнивает базы данных.

3 голосов
/ 15 сентября 2011

Имейте в виду, что для SQL Server чувствительность к регистру основывается на сопоставлении.Параметры сортировки по умолчанию не чувствительны к регистру, но их можно изменить, чтобы они учитывали регистр.Аналогичный пример: почему базы данных Oracle по умолчанию используют западноевропейский набор символов, когда UTF требуется для глобальных приложений, которые используют символы не ASCII?Я думаю, что это просто предпочтение поставщика.

3 голосов
/ 15 сентября 2011

Если бы мне пришлось угадывать, я бы сказал, по причинам исторической / обратной совместимости.
Oracle впервые появился в 1977 году, и, вероятно, с технологией в то время вычислительно дорого было выполнять дополнительную работу для поиска без учета регистра, поэтому они просто выбрали точное совпадение.

0 голосов
/ 15 сентября 2011

Для некоторых приложений важна чувствительность к регистру, а для других - нет.Независимо от того, какую СУБД вы используете, бизнес-требования должны определять, нужно ли вам учитывать регистр или нет.Я бы не стал слишком беспокоиться о «по умолчанию».

...