Конфигурация Firebird - выключить чувствительность к регистру - PullRequest
3 голосов
/ 01 октября 2010

Я хочу выполнить поиск без учета регистра в базе данных Firebird, не изменяя фактические запросы.Другими словами, я бы хотел, чтобы все мои существующие операторы «SELECT / WHERE / LIKE» извлекали BOB, Bob и bob.Позволяет ли конфигурация Firebird изменить это поведение?

Ответы [ 3 ]

2 голосов
/ 01 октября 2010

Попробуйте использовать что-то вроде: Представьте, что у вас есть таблица таких людей:

CREATE TABLE PERSONS (
  PERS_ID INTEGER NOT NULL PRIMARY KEY,
  LAST_NAME VARCHAR(50),
  FIRST_NAME VARCHAR(50)
);

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

Мы хотим, чтобы этот поиск не учитывал регистр, т.е. независимо от того, вводит ли пользователь «Пресли», «Пресли», «ПРЕСЛИ» или даже «Пресли», мы всегда хотим найти короля.

Ах да, и мы хотим, чтобы этот поиск был быстрым, пожалуйста. Так что должен быть индекс, ускоряющий его.

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

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

Чтобы получить действительно совершенные результаты, необходимо сопоставление без учета регистра (CI) и / или без учета акцента (AI). Однако на момент написания этой статьи (июль 2006 г.) в Firebird 2.0 было только два чешских сопоставления AI / CI. Надеемся, что со временем ситуация улучшится.

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

Чтобы получить правильные результаты от функции UPPER(), встроенной в Firebird, вы должны указать параметры сортировки. Это может быть в определении DDL таблицы:

CREATE TABLE PERSONS (
  PERS_ID INTEGER NOT NULL PRIMARY KEY,
  LAST_NAME VARCHAR(50) COLLATE DE_DE,
  FIRST_NAME VARCHAR(50) COLLATE DE_DE
);

или это можно сделать при вызове функции UPPER():

SELECT UPPER (LAST_NAME COLLATE DE_DE) FROM PERSONS;

http://www.destructor.de/firebird/caseinsensitivesearch.htm

или вы можете отредактировать свои запросы и добавить функцию lower()

LOWER()

Доступно в: DSQL, ESQL, PSQL

Добавлено в: 2.0

Описание: возвращает строчный эквивалент входной строки. Эта функция также правильно вводит строчные буквы, не являющиеся символами ASCII, даже если используется сопоставление по умолчанию (двоичное). Набор символов должен быть соответствующим, хотя: с ASCII или NONE, например, только символы ASCII в нижнем регистре; с октетами вся строка возвращается без изменений.

Тип результата: VAR(CHAR)

Синтаксис:

LOWER (str)

Важно

Если в вашей базе данных объявлена ​​внешняя функция LOWER, она запутает внутреннюю функцию. Чтобы сделать внутреннюю функцию доступной, УДАЛИТЕ или ИЗМЕНИТЕ внешнюю функцию (UDF).

Пример:

select field from table
  where lower(Name) = 'bob'

http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-lower.html

0 голосов
/ 07 апреля 2017

Necromancing.
Вместо строчного поля вы можете указать параметры сортировки:

SELECT field FROM table
WHERE Name = 'bob' COLLATE UNICODE_CI

См https://firebirdsql.org/refdocs/langrefupd21-collations.html

Возможно, вы также можете указать его как набор символов по умолчанию для базы данных, см. http://www.destructor.de/firebird/charsets.htm

0 голосов
/ 23 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...