PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Общо решение Ruby за SQLite3 LIKE или PostgreSQL ILIKE?

Коренът на проблемата се намира тук:

Използвам SQLite3 за разработка и PostgreSQL за внедряване.

Това е лоша идея™. Ще продължите да се сблъсквате с несъвместимости - или по-лошо:няма да осъзнавате някои, докато не бъде нанесена щета.
Използвайте същата RDBMS (PostgreSQL) за разработка и производство и си спестете безсмислените проблеми.

Докато сте заседнали с вашата злощастна настройка, има просто решение :

lower(style) LIKE lower(?)

Работи и на двете платформи.

  • Можете да пуснете дясната lower() , ако предоставите модел за търсене с малки букви.

  • В стандартния SQLite lower(X) сгъва само ASCII букви. За повече информация цитирам главата Основни функции в ръководството за SQLite:

    Функцията lower(X) връща копие на низ X с всички ASCII знаци, преобразувани в малки букви. Вградената по подразбиране low() функция работи само за ASCII знаци. За да извършите преобразуване на главни и главни букви върху знаци, които не са ASCII, заредете разширението ICU .

    Акцент мой.

  • PostgreSQL lower(X) работи с UTF-8 от кутията.

Като добре дошъл страничен ефект можете да ускоритете повишете тази заявка в PostgreSQL с индекс на израза lower(style) , което ще бъде по-бързо от използването на ILIKE и основен индекс на style .

Освен това, от PostgreSQL 9.1 можете да използвате GIN или GIST индекс с pg_trgm разширение за ускоряване на всяко LIKE и ILIKE заявка - триграмите не са чувствителни към главни букви. Подробни инструкции и връзки в този свързан отговор:

  • Подобни UTF-8 низове за поле за автоматично довършване


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайте \copy на psql за многоредова заявка

  2. isnumeric() с PostgreSQL

  3. Как pg_typeof() работи в PostgreSQL

  4. cursor.execute(INSERT INTO im_entry.test (+entrym+) СТОЙНОСТИ ('+p+');)

  5. Postgres INTERVAL използва стойност от таблицата