Oracle не учитывать регистр

Обновлено: 06.07.2024

где на самом деле, реальное значение Value и dicksavagewood .

они нечувствительны к регистру, если вы не делаете двоичное сравнение.

вы можете в нижнем регистре значение и переданный параметр:

другой (лучший) способ было бы использовать COLLATE оператор, как сказал документации

ИСПОЛЬЗОВАТЬ ДВОИЧНЫЙ

Это простой выбор

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

это выбор с двоичным

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

или

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0

сравнение строк, где фраза не чувствительна к регистру. Вы можете попробовать сравнить с помощью

или

и вы получите тот же результат. Это поведение по умолчанию MySQL.

если вы хотите, чтобы сравнение было регистр, вы могли бы добавить COLLATE вот так:

что SQL даст другой результат с этим: Где colname COLLATE latin1_general_cs = 'ключевое слово'

latin1_general_cs общий или сортировки по умолчанию в большинстве баз данных.

сравнения регистр когда столбец использует параметры сортировки, которые заканчиваются на _ci (например,по умолчанию latin1_general_ci параметры сортировки) и они регистр когда столбец использует параметры сортировки, которые заканчиваются на _cs или _bin (например, utf8_unicode_cs и utf8_bin параметры сортировки).

проверить параметры сортировки

вы можете проверить свой сервер,база данных и подключение параметры сортировки с помощью:

и вы можете проверить свой стол параметры сортировки с использованием:

изменить параметры сортировки

вы можете изменить параметры сортировки базы данных, таблицы или столбца на что-то чувствительное к регистру следующим образом:

ваши сравнения теперь должны быть чувствительны к регистру.

параметры сортировки, которые вы выбираете, устанавливают, чувствительны ли вы к регистру или нет.

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

скрипт создает таблицу. Обратите внимание, внизу написано "COLLATE latin1_general_cs". Этот cs в конце означает, что регистр чувствителен. Если вы хотели таблицы без учета регистра можно либо оставить часть или использовать "разобрать по копиям latin1_general_ci".

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

вы можете попробовать его. надеюсь, что это будет полезно.

Поведение по умолчанию LIKE и других операторов сравнения и = т. Д. Чувствительно к регистру.

Можно ли сделать их без учета регистра?

Дружеское напоминание о том, что некоторые примеры поиска приведут к полному сканированию таблицы, даже если есть индекс для user_name. Рассматривали ли вы использовать REGEXP_LIKE(username,'me','i') вместо как, как?

Начиная с 10gR2, Oracle позволяет тонко настраивать поведение сравнения строк, устанавливая параметры NLS_COMP и NLS_SORT сессию:

Вы также можете создавать регистры без учета регистра:

Эта информация была взята из поисков без учета регистра Oracle . В статье упоминается, REGEXP_LIKE но, похоже, она работает и со старым добрым = .

В версиях старше 10gR2 это не может быть сделано, и обычный подход, если вам не нужен нечувствительный к акценту поиск, заключается просто UPPER() в столбце и поисковом выражении.

Это хорошо работает, но делает ОБНОВЛЕНИЯ с использованием операторов LIKE / = очень медленными . :( @SaqibAli Произвольные LIKE выражения (например, WHERE foo LIKE '%abc%' ) уже достаточно медленные, если их нельзя проиндексировать, я не думаю, что это определенно связано с чувствительностью к регистру. Вы также можете установить их вне SQLPLUS, как в среде оболочки. Например, используя скрипт Perl DBD::Oracle , вы можете написать $ENV = 'BINARY_CI'; $ENV = 'LINGUISTIC'; перед вызовом `DBI-> connect`. эй ALTER SESSION только изменяет ваш локальный экземпляр исправления и означает ли это, как ваш текущий сеанс, то есть, если я закрою и снова открою, он будет сброшен. Есть ли способ, которым я могу видеть текущие значения, чтобы, если он сохранялся везде, я мог вернуться к исходным настройкам .

Существует 3 основных способа выполнения поиска без учета регистра в Oracle без использования полнотекстовых индексов.

В конечном итоге, какой метод вы выберете, зависит от ваших индивидуальных обстоятельств; Главное, что нужно помнить, это то, что для повышения производительности вы должны правильно индексировать для поиска без учета регистра.

1. Обсудите ваш столбец и строку одинаково.

Вы можете заставить все ваши данные быть в одном и том же случае с помощью UPPER() или LOWER() :

Если column_1 индекс не включен upper(column_1) или lower(column_1) , в зависимости от ситуации, это может привести к полному сканированию таблицы. Чтобы избежать этого, вы можете создать индекс на основе функций .

Если вы используете LIKE, вы должны объединить % вокруг искомой строки.

Эта скрипта SQL демонстрирует, что происходит во всех этих запросах. Обратите внимание на планы объяснения, которые указывают, когда индекс используется, а когда нет.

2. Используйте регулярные выражения.

От Oracle 10g и REGEXP_LIKE() более доступна. Вы можете указать _match_parameter_ 'i' , чтобы выполнить поиск без учета регистра.

Чтобы использовать это как оператор равенства, вы должны указать начало и конец строки, которая обозначается в каратах и ​​знаком доллара.

Чтобы выполнить эквивалент LIKE, их можно удалить.

Будьте осторожны с этим, поскольку ваша строка может содержать символы, которые будут по-разному интерпретироваться механизмом регулярных выражений.

Эта SQL Fiddle показывает тот же пример вывода, за исключением использования REGEXP_LIKE ().

3. Измените его на уровне сеанса.

Параметр NLS_SORT управляет последовательностью сортировки для упорядочения и различных операторов сравнения, в том числе = и LIKE. Вы можете указать двоичную сортировку без учета регистра, изменив сеанс. Это будет означать, что каждый запрос, выполненный в этом сеансе, будет выполнять параметры без учета регистра.

Существует много дополнительной информации о лингвистической сортировке и поиске строк, если вы хотите указать другой язык или выполнить нечувствительный к акценту поиск с помощью BINARY_AI.

Вам также необходимо изменить параметр NLS_COMP ; Цитировать:

Точные операторы и предложения запроса, которые подчиняются параметру NLS_SORT, зависят от значения параметра NLS_COMP. Если оператор или предложение не подчиняются значению NLS_SORT, как определено NLS_COMP, используемое сопоставление - BINARY.

Значением по умолчанию NLS_COMP является BINARY; но LINGUISTIC указывает, что Oracle должен обратить внимание на значение NLS_SORT:

Для сравнения всех операций SQL в предложении WHERE и в блоках PL / SQL следует использовать лингвистическую сортировку, указанную в параметре NLS_SORT. Чтобы повысить производительность, вы также можете определить лингвистический индекс для столбца, для которого вы хотите лингвистические сравнения.

Итак, еще раз, вам нужно изменить сеанс

Как отмечено в документации, вы можете создать лингвистический индекс для повышения производительности.

Поведение по умолчанию для LIKE и других операторов сравнения, = и т. Д. Учитывает регистр.

Можно ли сделать их нечувствительными к регистру?

Начиная с 10gR2, Oracle позволяет точно настраивать поведение сравнения строк, задавая NLS_COMP и NLS_SORT параметры сеанса:

Вы также можете создавать индексы без учета регистра:

Эта информация была взята из поисковых запросов Oracle без учета регистра. В статье упоминается REGEXP_LIKE , но, похоже, он работает и со старым-добрым = .

В версиях старше 10gR2 это невозможно сделать, и обычный подход, если вам не нужен нечувствительный к акценту поиск, состоит в том, чтобы просто UPPER() и столбец, и выражение поиска .

Есть 3 основных способа выполнить поиск без учета регистра в Oracle без использования полнотекстовых индексов.

В конечном счете, какой метод вы выберете, зависит от ваших индивидуальных обстоятельств; главное помнить, что для повышения производительности вы должны правильно индексировать поиск без учета регистра.

1. Сохраняйте столбец и строку одинаково.

Вы можете заставить все ваши данные быть одинаковыми, используя UPPER() или LOWER() :

Если column_1 не проиндексирован на upper(column_1) или lower(column_1) , в зависимости от ситуации, это может вызвать полное сканирование таблицы. Чтобы избежать этого, вы можете создать индекс на основе функций .

Если вы используете LIKE, вам нужно объединить % вокруг искомой строки.

Этот скрипт SQL демонстрирует, что происходит во всех этих запросах. Обратите внимание на планы объяснения, которые указывают, когда индекс используется, а когда нет.

2. Используйте регулярные выражения.

Начиная с Oracle 10g и далее REGEXP_LIKE() доступен. Вы можете указать _match_parameter_ 'i' , чтобы выполнять поиск без учета регистра.

Чтобы использовать это как оператор равенства, вы должны указать начало и конец строки, которые обозначаются каратом и знаком доллара.

Чтобы выполнить аналог LIKE, их можно удалить.

Будьте осторожны с этим, поскольку ваша строка может содержать символы, которые будут по-разному интерпретироваться обработчиком регулярных выражений.

Этот скрипт SQL показывает тот же пример вывода, за исключением использования REGEXP_LIKE ().

3. Измените его на уровне сеанса.

Параметр NLS_SORT управляет последовательностью сопоставления для упорядочивания. и различные операторы сравнения, включая = и LIKE. Вы можете указать двоичную сортировку без учета регистра, изменив сеанс. Это будет означать, что каждый запрос, выполняемый в этом сеансе, будет выполнять параметры без учета регистра.

Существует много дополнительной информации о лингвистической сортировке и поиске строк если вы хотите указать другой язык, или выполнить поиск без учета акцента, используя BINARY_AI.

Вам также потребуется изменить параметр NLS_COMP. ; Цитировать:

Точные операторы и предложения запроса, которые подчиняются параметру NLS_SORT, зависят от значения параметра NLS_COMP. Если оператор или предложение не подчиняется значению NLS_SORT, как определено NLS_COMP, используется сопоставление BINARY.

Значение NLS_COMP по умолчанию - BINARY; но LINGUISTIC указывает, что Oracle следует обратить внимание на значение NLS_SORT:

При сравнении всех операций SQL в предложении WHERE и в блоках PL / SQL следует использовать лингвистическую сортировку, указанную в параметре NLS_SORT. Чтобы повысить производительность, вы также можете определить лингвистический индекс для столбца, для которого вы хотите лингвистические сравнения.

Итак, еще раз вам нужно изменить сеанс

Как указано в документации, вы можете создать лингвистический индекс для повышения производительности

функции UPPER, LOWER, NLS_COMP, NLS_SORT в PL/SQL

Регистр символов часто играет важную роль в работе со строками. Например, может потребоваться сравнить две строки независимо от регистра. Выбор решения этой проблемы зависит как от версии базы данных, так и от области действия выполняемых операций.

Преобразование строки к верхнему или нижнему регистру

Для решения проблем с регистром символов можно воспользоваться встроенной функцией UPPER или LOWER . Эти функции преобразуют всю строку за одну операцию. Пример:

В этом примере обе строки обрабатываются функцией LOWER , так что в итоговом сравнении участвуют строки ' andrew sears' и ' andrew sears '.

Сравнение без учета регистра символов

Начиная с Oracle10g Release 2, появилась возможность использования параметров инициализации NLS_COMP и NLS_SORT для включения режима сравнения без учета регистра. Задайте параметру NLS_COMP значение LINGUISTIC ; тем самым вы прикажете Oracle использовать NLS_SORT для сравнений строк. Затем задайте параметру NLS_SORT значение, соответствующее сравнению без учета регистра — например, BINARY_CI или XWEST_EUROPEAN_CI . (Суффикс _CI означает «Case Insensitivity», то есть «Без учета регистра».) Приведенный далее простой пример показывает, какие проблемы решаются при помощи NLS_COMP . Требуется взять список имен и определить, какое из них должно стоять на первом месте:

В моей системе этот вызов LEAST возвращает строку ' JONATHAN '. Дело в том, что в порядке сортировки символы верхнего регистра предшествуют символам нижнего регистра. По умолчанию параметру NLS_COMP задается значение BINARY , при котором результат строковых сравнений, выполняемых такими функциями, как LEAST , определяется кодами символов.

Возможно, вы предпочитаете, чтобы функция LEAST игнорировала регистр символов и возвращала 'jon' вместо ' JONATHAN '. Измените значение NLS_COMP , чтобы при сортировке учитывалось значение NLS_SORT :

Теперь необходимо изменить NLS_SORT с указанием нужных правил сортировки.

По умолчанию переменная NLS_SORT часто равна BINARY , но значение может быть и другим в зависимости от конфигурации системы. В нашем примере будет использоваться сортировка BINARY_CI :

Попробуем снова вызвать LEAST :

На этот раз будет получен результат ' jon '. Пример кажется простым, но добиться такого результата без только что описанной сортировки по правилам языка будет нелегко.

Действие языковой сортировки распространяется не только на функции, но и на простые сравнения строк. Пример:

При указанных значениях параметров NLS_COMP и NLS_SORT выражение ' Jonathan ' = ' JONATHAN ' в этом примере равно TRUE .

Параметры NLS_COMP и NLS_SORT влияют на все операции со строками. Они продолжают действовать вплоть до их явного изменения или до завершения сеанса.

Oracle также поддерживает режим сортировки без учета диакритических знаков; чтобы включить его, присоедините к имени правила сортировки суффикс _AI (вместо _CI ).

За полным списком правил языковой сортировки обращайтесь к документации Oracle Database Globalization Support Guide. В этом руководстве также подробно объясняется действие параметров NLS_COMP и NLS_SORT .

Регистр символов и индексы

При работе со строками часто возникает необходимость в поиске и сравнении без учета регистра символов. Но если вы реализуете описанный здесь прием, вдруг выясняется, что ваше приложение перестает использовать индексы и начинает работать слишком медленно. Будьте внимательны, чтобы ваши действия не повредили использованию индексов в SQL. Для наглядности рассмотрим пример с демонстрационной таблицей hr.employees . Таблица employees использует индекс emp_name_ix для столбцов last_name , first_name . Мой код включает следующую команду SQL:

Изначально код использует индекс emp_name_ix , но когда я задаю параметры NLS_COMP=LINGUISTIC и NLS_SORT=BINARY_CI , чтобы включить поиск без учета регистра, индекс перестает использоваться, и операции выполняются с полным просмотром таблицы — со всеми вытекающими последствиями! Одно из возможных решений заключается в использовании индекса на базе функции, игнорирующего регистр символов:

Теперь при выполнении запросов без учета регистра символов используется индекс без учета регистра, а быстродействие программы остается на высоком уровне.

Преобразование первого символа к верхнему регистру

Кроме функций UPPER и LOWER , для преобразования регистра символов используется функция INITCAP . Она преобразует первую букву каждого слова в строке к верхнему регистру, а все остальные буквы — к нижнему регистру. Например, следующий фрагмент:

выводит следующий результат:

Идея использовать INITCAP для форматирования имен выглядит заманчиво, и все будет хорошо, пока вы не столкнетесь с особым случаем:

Правильное написание фамилии — «McWilliams», а не «Mcwilliams». Помните, что функция INITCAP временами удобна, но она выдает неверный результат для имен и слов, которые содержат более одной буквы в верхнем регистре.

Поведение по умолчанию LIKE и других операторов сравнения = т.д. Учитывает регистр.

Возможно ли сделать их нечувствительными к регистру?

Дружеское напоминание о том, что некоторые примеры поиска приведут к полному сканированию таблицы, даже если есть индекс для user_name.

Поскольку 10gR2, Oracle позволяет точно настроить поведение сравнения строк, установив NLS_COMP и NLS_SORT параметры сеанса:

Вы также можете создавать индексы без регистров:

Эта информация была взята из нечувствительных к регистру запросов в Oracle. В статье упоминается REGEXP_LIKE , но, похоже, он работает и с добрым старым = .

В версиях старше 10gR2 это не может быть действительно сделано, и обычный подход, если вам не нужен поиск с акцентовым доступом, - это просто UPPER() как столбец, так и выражение поиска.

Это хорошо работает, но делает ОБНОВЛЕНИЯ с использованием операторов LIKE / = очень медленными . :( Я даже пытался с оператором =. Та же медленная производительность. эй, ALTER SESSION только изменяет ваш локальный экземпляр исправления и означает ли это, как ваш текущий сеанс, то есть, если я закрою и снова открою, он бы сбросил. Есть ли способ, которым я могу видеть, каковы текущие значения, так что, если оно сохраняется везде, я могу вернуться к исходным настройкам .

Существует 3 основных способа выполнить поиск без учета регистра в Oracle без использования полнотекстовых индексов.

В конечном счете, какой метод вы выбираете, зависит от ваших индивидуальных обстоятельств; главное, чтобы помнить, что для повышения производительности вы должны правильно индексировать регистр без учета регистра.

1. Введите столбец и строку точно.

Вы можете заставить все свои данные быть в одном и том же случае, используя UPPER() или LOWER() :

Если column_1 не индексируется на upper(column_1) или lower(column_1) , это может привести к полному сканированию таблицы. Чтобы этого избежать, вы можете создать функциональный индекс.

Если вы используете LIKE, вам необходимо объединить % вокруг строки, которую вы ищете.

Этот скрипт SQL показывает, что происходит во всех этих запросах. Обратите внимание на Объяснительные планы, которые указывают, когда используется индекс, и когда это не так.

2. Используйте регулярные выражения.

От Oracle 10g вперед REGEXP_LIKE() доступен. Вы можете указать _match_parameter_ 'i' , чтобы выполнить поиск без учета регистра.

Чтобы использовать это как оператор равенства, вы должны указать начало и конец строки, которая обозначается значком карата и знака доллара.

Чтобы выполнить эквивалент LIKE, они могут быть удалены.

Будьте осторожны с этим, так как ваша строка может содержать символы, которые будут интерпретироваться по-разному с помощью механизма регулярных выражений.

Этот скрипт SQL показывает вам тот же примерный вывод, за исключением использования REGEXP_LIKE().

3. Измените его на уровне сеанса.

Параметр NLS_SORT управляет последовательностью сортировки для упорядочения и различными операторами сравнения, включая = и LIKE. Вы можете указать двоичный, нечувствительный к регистру, сортировку, изменив сеанс. Это будет означать, что каждый запрос, выполняемый в этом сеансе, будет выполнять нечувствительные к регистру параметры.

Имеется много дополнительной информации о лингвистической сортировке и поиске строк, если вы хотите указать другой язык или выполнить поиск без акцента, используя BINARY_AI.

Вам также потребуется изменить параметр NLS_COMP; цитата:

Точные операторы и предложения запроса, которые подчиняются параметру NLS_SORT зависят от значения параметра NLS_COMP. Если оператор или не соответствует значению NLS_SORT, как определено NLS_COMP, используемая сортировка - BINARY.

Значение по умолчанию NLS_COMP равно BINARY; но, LINGUISTIC указывает, что Oracle следует обратить внимание на значение NLS_SORT:

Сравнение всех операций SQL в предложении WHERE и в PL/SQL блоки должны использовать лингвистическую сортировку, указанную в NLS_SORT параметр. Чтобы повысить производительность, вы также можете определить лингвистический индекс в столбце, для которого вы хотите лингвистическую сравнения.

Итак, еще раз вам нужно изменить сеанс

Как указано в документации, вы можете создать лингвистический индекс для повышения производительности

Читайте также: