2009-12-18 8 views
5

Zajmuję się tworzeniem aplikacji w Railsach na OS X przy użyciu PostgreSQL 8.4. Muszę skonfigurować bazę danych dla aplikacji, aby standardowe zapytania tekstowe nie uwzględniały wielkości liter. Na przykład:Ktoś odniósł sukces, używając specyficznych ustawień narodowych dla bazy danych PostgreSQL, aby w porównaniu nie było rozróżniania wielkości liter?

select * from dokumentów WHERE title = 'niesamowite dokument'

powinien zwrócić ten sam rezultat jak:

select * from dokumentów WHERE title = 'Incredible Dokument'

Żeby było jasne, nie chcę użyć:

(1), jak w przypadkach rozdziału lub innego rodzaju specjalnych operatorów porównania

(2) citext do typu danych kolumny lub inne specjalne indeksu kolumny

(3) Każdy typ oprogramowania pełnego tekstu tak jak Sphinx

Chcę ustawić ustawienia regionalne, aby zapewnić obsługę rozróżniania wielkości znaków bez rozróżniania wielkości liter. Pracuję w systemie Mac OS X (10.5 Leopard) i próbowałem już ustawić kodowanie na "LATIN1", a ustawienia Collation i Ctype ustawiono na "en_US.ISO8859-1". Dotychczas nie osiągnięto żadnego sukcesu.

Każda pomoc lub sugestie są mile widziane.

Dzięki!

Aktualizacja

I zostały oznaczone jednym z udzielonych odpowiedzi jako poprawną odpowiedź z szacunku dla ludzi, którzy odpowiedzieli. Jednak postanowiłem rozwiązać ten problem inaczej niż sugerowano. Po dalszym przeglądzie aplikacji, istnieje tylko kilka przypadków, w których potrzebuję porównywania wielkości liter z polem bazy danych, więc będę tworzyć pola bazy danych dla tych, których potrzebuję do porównania bez rozróżniania wielkości liter. Na przykład name i name_lower. Sądzę, że natknąłem się na to rozwiązanie w internecie. Mam nadzieję, że PostgreSQL pozwoli na podobne opcje sortowania do tego, co SQL Server zapewnia w przyszłości (tj. DOCI).

Specjalne podziękowania dla wszystkich, którzy odpowiedzieli.

+0

co z indeksu na 'górne (tytuł)' i poszukiwania z 'UPPER (title) = UPPER (" Cokolwiek ciąg ")'? –

+0

Używam Ruby on Rails i chciałbym, aby środowisko mogło obsłużyć jak najwięcej SQL. Nie zawsze mogę używać PostgreSQL dla tego projektu. –

Odpowiedz

1

Będziesz prawdopodobnie potrzebować czegoś takiego jak użyć funkcji kolumnowej do konwersji tekstu, np. konwersji na wielkie litery - przykład:

SELECT * FROM documents WHERE upper(title) = upper('incredible document') 

Uwaga, że ​​może to zepsuć wydajność zastosowanego skanowanie indeksu, ale jeśli staje się problem można zdefiniować indeksu w tym funkcji kolumnowej na kolumnach docelowych np

CREATE INDEX I1 on documents (upper(title)) 
+0

, jak powiedzieli inni faceci, robienie tego za pomocą zestawu znaków lub lokalizacji nie jest rozsądnym rozwiązaniem. –

+0

Dlaczego nie byłoby to rozsądne? –

+0

@Kevin, zestaw znaków, który nie rozróżniał wielkich i małych liter, logicznie zapisywałby znaki jako glify z rozróżnianiem wielkości liter. Nie ma zestawu znaków dla wspólnego alfabetu łacińskiego, który to robi. Dostępne lokalizacje są po prostu skrótem do wyboru domyślnego kodowania znaków, np. Zestawu znaków. –

0

Twój problem i twoje wyjątki są jak powiedzenie "Chcę pływać, ale nie chcę ruszać ramionami".

Utoniesz próbując.

+2

Nie, pochodzę z tła SQL Server, w przypadku którego porównywanie wielkości liter nie zależy od wielkości liter. –

+1

Serwer SQL jest uszkodzony, a następnie. – alvherre

+0

"Serwer SQL jest uszkodzony", bardzo zabawny. – mark

0

Nie sądzę, że to jest to, co jest używane do lokalnego lub kodowania. Kodowanie to raczej wybór zestawu znaków, a nie ustalanie sposobu postępowania z postaciami. Gdyby było ustawienie, które byłoby w konfiguracji, ale nie widziałem żadnego.

Jeśli nie chcesz używać ilike ze strachu przed niemożnością przeniesienia do innej bazy danych, proponuję sprawdzić, jakie opcje ORM mogą być dostępne w ActiveRecord, jeśli używasz tego.

jest tu coś z jednego z najlepszych Postgres facetów: http://archives.postgresql.org/pgsql-php/2003-05/msg00045.php

EDIT: stałe konkretnych odniesień do lokalizacji.

+0

i zostałem odrzucony, dlaczego? Jeśli powiedziałem coś niepoprawnie, chciałbym wiedzieć, co to było. –

+0

@Arthur, podczas gdy nie przesłałem ci odpowiedzi, chciałbym zauważyć, że ustawienia regionalne i zestawy znaków są powiązane, ale różne. –

+0

ah, pomyliłem się, gdy odpowiadałem. Myślałem o kodowaniu w mojej głowie. dzięki za wskazanie tego. Locale z pewnością nie byłby do tego użyty. Kodowanie naprawdę "działałoby" tylko wtedy, gdyby były ustawione znaki, gdyby nie były wielkie litery lub coś w tym rodzaju. Gdyby tam był - konfigurowalny element, znajdowałby się w pliku konfiguracyjnym postgresql. –

1

Z wszystkich ograniczeń zostały ustawione, możliwie jedynym sposobem, aby to działało jest zdefiniowanie własnego operatora = dla tekstu. Jest bardzo prawdopodobne, że spowoduje to inne problemy, takie jak tworzenie uszkodzonych indeksów. Poza tym najlepszym wyjściem wydaje się użycie typu danych citext; to nadal pozwala na użycie ORM-ów, które generują kod SQL.

(ja nie wspomnieć o możliwości tworzenia własnych definicji lokalizacji, bo nie słyszał, żeby ktoś to robi.)

0
SELECT * FROM documents WHERE title ~* 'incredible document' 
Powiązane problemy