Czy PostgreSQL może utworzyć bazę danych z rozróżnianiem wielkości liter?

10

Przesyłam trochę kodu z jakiejś wersji Sybase do PostgreSQL. Jest to aplikacja C korzystająca z biblioteki klienta Sybase. Moje podejście polega na napisaniu warstwy tłumaczącej, która tłumaczy wywołania dbsqlexec()na PQexec()(na przykład). Ta część w większości działa.

Wygląda na to, że baza danych Sybase jest skonfigurowana z uwzględnieniem wielkości liter (w odniesieniu do nazw obiektów bazy danych). Na przykład istnieje zarówno WIDGETstół, jak i widgetstół. Wygląda na to, że konwencją w tej aplikacji jest to, że wielkie litery wskazują rzeczywiste tabele danych, podczas gdy małe litery są używane jako tabele tymczasowe podczas wykonywania niektórych operacji.

Zgodnie z 4.1 Struktura leksykalnaSłowa kluczowe i niecytowane identyfikatory nie uwzględniają wielkości liter. ” Wiem, że mogę cytować identyfikatory, aby wyłączyć automatyczne składanie do małych liter, ale nie chcę tego robić ręcznie przez zilliony linii kodu korzystającego z tej bazy danych.

Czy istnieje sposób skonfigurowania PostgreSQL w celu wyłączenia automatycznego składania spraw w przypadku identyfikatorów obiektów bazy danych?

Moją alternatywą będzie napisanie kodu, który bada każdą instrukcję SQL i umieszcza podwójne cudzysłowy wokół każdego identyfikatora (który nie jest słowem kluczowym).

Greg Hewgill
źródło
Słowa kluczowe mogą być użyte jako identyfikatory, jeśli są cytowane podwójnie - nawet jeśli nie powinieneś tego robić. W każdym razie nie możesz być pewien, że niektóre identyfikatory z twojej bazy kodu Sybase nie są słowami kluczowymi w PostgreSQL. Tym bardziej powód do podwójnego cytowania identyfikatorów lub, najlepiej, zmiany ich nazw.
Erwin Brandstetter,
niecytowane identyfikatory w postgresie w rzeczywistości wcale nie rozróżniają wielkości liter, są traktowane jak wszystkie małe litery. więc tAbLeNaMe dopasuje pojedynczą tabelę o nazwie tablename, ale nie taką o nazwie tableName. Zmieniłbym nazwy tabel, bo inaczej ludzie zapomną „i przez pomyłkę uzyskają dostęp do małej wersji.”
JamesRyan
@JamesRyan: to źle. select * from TaBlEnAmEbędzie odnosić się do tej samej tabeli co select * from tablenamelubselect * from TABLENAME
a_horse_w_no_name
@a_horse_w_na_nazwie: jeśli ty create table "tableName" (id integer primary key);, a następnie create table "tablename" (id integer primary key);to zapytanie select * from TaBlEnAmE;wybierze z „tablename”, a nie z „tableName”. „Niecytowane nazwiska są zawsze składane na małe litery” .
Mike Sherrill „Cat Recall”

Odpowiedzi:

3

Skończyło się na tym, że napisałem kod, który przekształca SQL generowany przez aplikację w SQL kompatybilny z PostgreSQL. To całkiem proste:

  • Podziel instrukcję na sensowne tokeny, pomijając literackie ciągi cudzysłowu
  • Cytuj podwójnie wszystko, co nie jest słowem kluczowym ani liczbą

Skorzystałem również z tej warstwy, aby przekształcić połączenia isnulldo coalesce. Jak dotąd działa całkiem dobrze.

Greg Hewgill
źródło
używam cudzysłowów („blahblablah”), aby rozróżniać małe i wielkie litery .. działa dla mnie płynnie ..
Anuj Patel
1

Czy istnieje sposób skonfigurowania PostgreSQL w celu wyłączenia automatycznego składania spraw w przypadku identyfikatorów obiektów bazy danych?

Nie bezpośrednio. Być może będziesz w stanie wprowadzić stosunkowo niewielką zmianę w kodzie źródłowym PostgreSQL i ponownie go skompilować. (Rozpocznij w src / backend / parser / parser.c?) Ale byłbym zaskoczony, gdyby było to bardzo proste.

Mike Sherrill „Cat Recall”
źródło
Wolałbym nie zadzierać z kodem źródłowym, ponieważ wymagałoby to niestandardowej zmiany instalacji PostgreSQL za każdym razem, gdy cokolwiek zmieniło się (host, wersja itp.), A instalacje binarne byłyby niedostępne.
Greg Hewgill,