поиск без учета регистра sql
Функции поиска в строках
Во всех функциях, поиск регистрозависимый по умолчанию. Существуют варианты функций для регистронезависимого поиска.
position(haystack, needle), locate(haystack, needle)
Возвращает позицию (в байтах) найденной подстроки в строке, начиная с 1, или 0, если подстрока не найдена.
Для поиска без учета регистра используйте функцию positionCaseInsensitive.
Синтаксис
Аргументы
Возвращаемые значения
Примеры
Фраза «Hello, world!» содержит набор байт, представляющий текст в однобайтовой кодировке. Функция возвращает ожидаемый результат:
Аналогичная фраза на русском содержит символы, которые не могут быть представлены в однобайтовой кодировке. Функция возвращает неожиданный результат (используйте функцию positionUTF8 для символов, которые не могут быть представлены одним байтом):
Примеры работы функции с синтаксисом POSITION(needle IN haystack)
positionCaseInsensitive
Такая же, как и position, но работает без учета регистра. Возвращает позицию в байтах найденной подстроки в строке, начиная с 1.
Работает при допущении, что строка содержит набор байт, представляющий текст в однобайтовой кодировке. Если допущение не выполнено — то возвращает неопределенный результат (не кидает исключение). Если символ может быть представлен с помощью двух байтов, он будет представлен двумя байтами и так далее.
Синтаксис
Аргументы
Возвращаемые значения
Пример
positionUTF8
Возвращает позицию (в кодовых точках Unicode) найденной подстроки в строке, начиная с 1.
Работает при допущении, что строка содержит набор кодовых точек, представляющий текст в кодировке UTF-8. Если допущение не выполнено — то возвращает неопределенный результат (не кидает исключение). Если символ может быть представлен с помощью двух кодовых точек, он будет представлен двумя и так далее.
Для поиска без учета регистра используйте функцию positionCaseInsensitiveUTF8.
Синтаксис
Аргументы
Возвращаемые значения
Примеры
Фраза «Привет, мир!» содержит набор символов, каждый из которых можно представить с помощью одной кодовой точки. Функция возвращает ожидаемый результат:
positionCaseInsensitiveUTF8
Такая же, как и positionUTF8, но работает без учета регистра. Возвращает позицию (в кодовых точках Unicode) найденной подстроки в строке, начиная с 1.
Работает при допущении, что строка содержит набор кодовых точек, представляющий текст в кодировке UTF-8. Если допущение не выполнено — то возвращает неопределенный результат (не кидает исключение). Если символ может быть представлен с помощью двух кодовых точек, он будет представлен двумя и так далее.
Синтаксис
Аргументы
Возвращаемые значения
Пример
multiSearchAllPositions
The same as position but returns Array of positions (in bytes) of the found corresponding substrings in the string. Positions are indexed starting from 1.
The search is performed on sequences of bytes without respect to string encoding and collation.
Syntax
Parameters
Returned values
Example
multiSearchAllPositionsUTF8
multiSearchFirstPosition(haystack, [needle1, needle2, …, needlen])
multiSearchFirstIndex(haystack, [needle1, needle2, …, needlen])
Возвращает индекс i (нумерация с единицы) первой найденной строки needlei в строке haystack и 0 иначе.
multiSearchAny(haystack, [needle1, needle2, …, needlen])
Возвращает 1, если хотя бы одна подстрока needlei нашлась в строке haystack и 0 иначе.
Во всех функциях multiSearch* количество needles должно быть меньше 2 8 из-за особенностей реализации.
match(haystack, pattern)
Проверка строки на соответствие регулярному выражению pattern. Регулярное выражение re2. Синтаксис регулярных выражений re2 является более ограниченным по сравнению с регулярными выражениями Perl (подробнее).
Возвращает 0 (если не соответствует) или 1 (если соответствует).
Обратите внимание, что для экранирования в регулярном выражении, используется символ \ (обратный слеш). Этот же символ используется для экранирования в строковых литералах. Поэтому, чтобы экранировать символ в регулярном выражении, необходимо написать в строковом литерале \ (два обратных слеша).
Регулярное выражение работает со строкой как с набором байт. Регулярное выражение не может содержать нулевые байты.
Для шаблонов на поиск подстроки в строке, лучше используйте LIKE или position, так как они работают существенно быстрее.
multiMatchAny(haystack, [pattern1, pattern2, …, patternn])
Длина любой строки из haystack должна быть меньше 2 32 байт, иначе бросается исключение. Это ограничение связано с ограничением hyperscan API.
multiMatchAnyIndex(haystack, [pattern1, pattern2, …, patternn])
multiMatchAllIndices(haystack, [pattern1, pattern2, …, patternn])
multiFuzzyMatchAny(haystack, distance, [pattern1, pattern2, …, patternn])
multiFuzzyMatchAnyIndex(haystack, distance, [pattern1, pattern2, …, patternn])
multiFuzzyMatchAllIndices(haystack, distance, [pattern1, pattern2, …, patternn])
multiFuzzyMatch* функции не поддерживают UTF-8 закодированные регулярные выражения, и такие выражения рассматриваются как байтовые из-за ограничения hyperscan.
extract(haystack, pattern)
Извлечение фрагмента строки по регулярному выражению. Если haystack не соответствует регулярному выражению pattern, то возвращается пустая строка. Если регулярное выражение не содержит subpattern-ов, то вынимается фрагмент, который подпадает под всё регулярное выражение. Иначе вынимается фрагмент, который подпадает под первый subpattern.
extractAll(haystack, pattern)
Извлечение всех фрагментов строки по регулярному выражению. Если haystack не соответствует регулярному выражению pattern, то возвращается пустая строка. Возвращается массив строк, состоящий из всех соответствий регулярному выражению. В остальном, поведение аналогично функции extract (по прежнему, вынимается первый subpattern, или всё выражение, если subpattern-а нет).
extractAllGroupsHorizontal
Функция extractAllGroupsHorizontal работает медленнее, чем функция extractAllGroupsVertical.
Синтаксис
Аргументы
Возвращаемое значение
Пример
Смотрите также
extractAllGroupsVertical
Синтаксис
Аргументы
Возвращаемое значение
Пример
Смотрите также
like(haystack, pattern), оператор haystack LIKE pattern
% обозначает любое количество любых байт (в том числе, нулевое количество символов).
_ обозначает один любой байт.
Для экранирования метасимволов, используется символ \ (обратный слеш). Смотрите замечание об экранировании в описании функции match.
notLike(haystack, pattern), оператор haystack NOT LIKE pattern
То же, что like, но с отрицанием.
ilike
Синтаксис
Аргументы
Некоторые примеры pattern :
Возвращаемые значения
Пример
Смотрите также
ngramDistance(haystack, needle)
Вычисление 4-граммного расстояния между haystack и needle : считается симметрическая разность между двумя мультимножествами 4-грамм и нормализуется на сумму их мощностей. Возвращает число float от 0 до 1 – чем ближе к нулю, тем больше строки похожи друг на друга. Если константный needle или haystack больше чем 32КБ, кидается исключение. Если некоторые строки из неконстантного haystack или needle больше 32КБ, расстояние всегда равно единице.
ngramSearch(haystack, needle)
Для случая UTF-8 мы используем триграммное расстояние. Вычисление n-граммного расстояния не совсем честное. Мы используем 2-х байтные хэши для хэширования n-грамм, а затем вычисляем (не)симметрическую разность между хэш таблицами – могут возникнуть коллизии. В формате UTF-8 без учета регистра мы не используем честную функцию tolower – мы обнуляем 5-й бит (нумерация с нуля) каждого байта кодовой точки, а также первый бит нулевого байта, если байтов больше 1 – это работает для латиницы и почти для всех кириллических букв.
countMatches(haystack, pattern)
Синтаксис
Аргументы
Выбор без учета регистра MySQL
может ли кто-нибудь сказать мне, если a SELECT команда MySQL по умолчанию нечувствительна к регистру? А если нет, то какую команду мне нужно отправить, чтобы я мог сделать что-то вроде:
11 ответов:
они нечувствительны к регистру, если вы не делаете двоичное сравнение.
вы можете в нижнем регистре значение и переданный параметр:
другой (лучший) способ было бы использовать COLLATE оператор, как сказал документации
SELECT * FROM myTable WHERE ‘something’ = ‘Something’
это выбор с двоичным
SELECT * FROM myTable WHERE BINARY ‘something’ = ‘Something’
SELECT * FROM myTable WHERE ‘something’ = BINARY ‘Something’
сравнение строк, где фраза не чувствительна к регистру. Вы можете попробовать сравнить с помощью
и вы получите тот же результат. Это поведение по умолчанию 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».
Если ваш проект таким образом, что вы можете создать свой своя таблица, тогда имеет смысл указать свою настройка чувствительности к регистру при создании таблицы.
SQL Select не учитывает регистр.
Отметим также, что имена таблиц чувствительны к регистру в Linux, если вы выберите lower_case_table_name директива config to 1. Это связано с тем, что таблицы представлены файлами, чувствительными к регистру в Linux.
особенно остерегайтесь разработки в Windows, которая не чувствительна к регистру и развертывается в производство, где она есть. Например:
против таблицы myTable будет успешным в Windows, но не в Linux, опять же, если вышеупомянутая директива заданный.
вы можете попробовать его. надеюсь, что это будет полезно.
Поиск без учета регистра в Oracle
Поведение по умолчанию для LIKE и других операторов сравнения, = и т. Д. Учитывает регистр.
Можно ли сделать их нечувствительными к регистру?
6 ответов
Начиная с 10gR2, Oracle позволяет точно настраивать поведение сравнения строк, задавая NLS_COMP и NLS_SORT параметры сеанса:
Вы также можете создавать индексы без учета регистра:
Есть 3 основных способа выполнить поиск без учета регистра в Oracle без использования полнотекстовых индексов.
В конечном счете, какой метод вы выберете, зависит от ваших индивидуальных обстоятельств; главное помнить, что для повышения производительности вы должны правильно индексировать поиск без учета регистра.
1. Сохраняйте столбец и строку одинаково.
Вы можете заставить все ваши данные быть одинаковыми, используя UPPER() или LOWER() :
Если вы используете LIKE, вам нужно объединить % вокруг искомой строки.
Этот скрипт SQL демонстрирует, что происходит во всех этих запросах. Обратите внимание на планы объяснения, которые указывают, когда индекс используется, а когда нет.
2. Используйте регулярные выражения.
Чтобы использовать это как оператор равенства, вы должны указать начало и конец строки, которые обозначаются каратом и знаком доллара.
Чтобы выполнить аналог LIKE, их можно удалить.
Будьте осторожны с этим, поскольку ваша строка может содержать символы, которые будут по-разному интерпретироваться обработчиком регулярных выражений.
Этот скрипт SQL показывает тот же пример вывода, за исключением использования REGEXP_LIKE ().
3. Измените его на уровне сеанса.
Параметр NLS_SORT управляет последовательностью сопоставления для упорядочивания. и различные операторы сравнения, включая = и LIKE. Вы можете указать двоичную сортировку без учета регистра, изменив сеанс. Это будет означать, что каждый запрос, выполняемый в этом сеансе, будет выполнять параметры без учета регистра.
Существует много дополнительной информации о лингвистической сортировке и поиске строк если вы хотите указать другой язык, или выполнить поиск без учета акцента, используя BINARY_AI.
Вам также потребуется изменить параметр NLS_COMP. ; Цитировать:
Точные операторы и предложения запроса, которые подчиняются параметру NLS_SORT, зависят от значения параметра NLS_COMP. Если оператор или предложение не подчиняется значению NLS_SORT, как определено NLS_COMP, используется сопоставление BINARY.
При сравнении всех операций SQL в предложении WHERE и в блоках PL / SQL следует использовать лингвистическую сортировку, указанную в параметре NLS_SORT. Чтобы повысить производительность, вы также можете определить лингвистический индекс для столбца, для которого вы хотите лингвистические сравнения.
Итак, еще раз вам нужно изменить сеанс
Как указано в документации, вы можете создать лингвистический индекс для повышения производительности
MySQL без учета регистра выбора
Может кто-нибудь сказать мне, если SELECT запрос MySQL чувствителен к регистру или регистронезависимый по умолчанию? И если нет, то какой запрос я должен отправить, чтобы я мог сделать что-то вроде:
Вы можете в нижнем регистре значение и переданный параметр:
SELECT * FROM myTable WHERE ‘something’ = ‘Something’
Это выбор с двоичным
SELECT * FROM myTable WHERE BINARY ‘something’ = ‘Something’
SELECT * FROM myTable WHERE ‘something’ = BINARY ‘Something’
Сравнения нечувствительны к регистру, когда столбец использует параметры сортировки, которые заканчиваются на _ci (например, параметры latin1_general_ci сортировки по умолчанию ), и они чувствительны к регистру, когда столбец использует параметры сортировки, которые заканчиваются на _cs или _bin (такие как utf8_unicode_cs и utf8_bin сортировки).
Проверьте сопоставление
и вы можете проверить свою таблицу сортировки с помощью:
Изменить параметры сортировки
Вы можете изменить параметры сортировки базы данных, таблицы или столбца на следующие с учетом регистра:
Ваши сравнения должны теперь быть чувствительными к регистру.
Сравнение строк в фразе WHERE не чувствительно к регистру. Вы можете попробовать сравнить, используя
Этот SQL даст другой результат с этим: ГДЕ colname COLLATE latin1_general_cs = ‘ключевое слово’
latin1_general_cs в большинстве баз данных является обычной или стандартной сортировкой.
Выбранная вами сортировка устанавливает, чувствительны ли вы к регистру или нет.
По умолчанию регистр не учитывается, но следующая самая важная вещь, на которую вы должны обратить внимание, это то, как таблица была создана в первую очередь, потому что вы можете указать чувствительность к регистру при ее создании.
Сценарий ниже создает таблицу. Обратите внимание, внизу написано «COLLATE latin1_general_cs». Это cs в конце означает регистр символов. Если вы хотите, чтобы ваша таблица не учитывала регистр символов, вы должны либо пропустить эту часть, либо использовать «COLLATE latin1_general_ci».
Если ваш проект таков, что вы можете создать свою собственную таблицу, то имеет смысл указать ваши предпочтения с учетом регистра при создании таблицы.
Выбор SQL не чувствителен к регистру.
Особенно остерегайтесь разработки под Windows, которая не чувствительна к регистру и развертывается на производстве, где она есть. Например:
против таблицы myTable будет успешным в Windows, но не будет работать в Linux, опять же, если не установлена вышеупомянутая директива.
В настоящее время принятое решение является в основном правильным.
Если вы используете недвоичную строку (CHAR, VARCHAR, TEXT), сравнения не чувствительны к регистру в соответствии с параметрами сортировки по умолчанию.
Если вы используете двоичную строку (BINARY, VARBINARY, BLOB), сравнения выполняются с учетом регистра, поэтому вам нужно использовать, LOWER как описано в других ответах.
Если вы не используете параметры сортировки по умолчанию и используете небинарную строку, чувствительность к регистру определяется выбранным параметром сортировки.
Нечувствительный к регистру поиск в Oracle
Поведение по умолчанию LIKE и других операторов сравнения = т. Д. Учитывает регистр.
Возможно ли сделать их нечувствительными к регистру?
Начиная с 10gR2, Oracle позволяет точно настроить поведение сравнения строк, установив параметры сеанса NLS_COMP и NLS_SORT :
Вы также можете создавать индексы без учета регистра:
Существует 3 основных способа выполнить поиск без учета регистра в Oracle без использования полнотекстовых индексов.
В конечном счете, какой метод вы выбираете, зависит от ваших индивидуальных обстоятельств; главное, чтобы помнить, что для повышения производительности вы должны правильно индексировать регистр без учета регистра.
1. Введите свою колонку и строку точно.
Вы можете заставить все свои данные быть в одном и том же случае с помощью UPPER() или LOWER() :
Если вы используете LIKE, вам необходимо объединить % вокруг строки, которую вы ищете.
Этот SQL-скрипт демонстрирует, что происходит во всех этих запросах. Обратите внимание на пояснительные планы, которые указывают, когда используется индекс, а когда нет.
2. Используйте регулярные выражения.
Чтобы использовать это как оператор равенства, вы должны указать начало и конец строки, которая обозначается значком карата и знака доллара.
Чтобы выполнить эквивалент 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. Чтобы повысить производительность, вы также можете определить лингвистический индекс в столбце, для которого вы хотите провести лингвистические сравнения.
Итак, еще раз вам нужно изменить сеанс
Как указано в документации, вы можете создать лингвистический индекс для повышения производительности
возможно, вы можете попробовать использовать