Czy w składni SQL rozróżniana jest wielkość liter?

199

Rozróżnia wielkość liter w SQL. Użyłem MySQL i SQL Server, w których wydaje się, że wielkość liter ma znaczenie. Czy tak jest zawsze? Czy standard określa rozróżnianie wielkości liter?

Steve Tranby
źródło
1
Rozróżnianie
wielkości

Odpowiedzi:

181

SQL Słowa kluczowe są wielkości liter ( SELECT, FROM, WHEREitp), ale często są pisane wielkimi literami. Jednak w niektórych konfiguracjach w nazwach tabel i kolumn rozróżniana jest wielkość liter. MySQL ma opcję konfiguracji, aby ją włączyć / wyłączyć. Zazwyczaj nazwy tabel i kolumn z rozróżnianiem wielkości liter są domyślnymi w Linux MySQL, a rozróżnianie wielkości liter było kiedyś domyślne w systemie Windows, ale teraz instalator zapytał o to podczas instalacji. W przypadku MSSQL jest to funkcja ustawienia sortowania bazy danych.

Oto strona MySQL o rozróżnianiu wielkości liter w nazwach

Tutaj jest artykuł w MSDN na temat zestawień dla MSSQL

Stefan Rusek
źródło
7
W niektórych systemach (takich jak PostgreSQL) rozróżniane są wielkie i małe litery w nazwach tabel i kolumn, ale przed ich wyszukaniem spróbuj ukryć je za pomocą małych lub dużych liter we wszystkich nazwach. W tych systemach będziesz musiał zawrzeć nazwę tabeli w „podwójnych cudzysłowach”, aby upewnić się, że podana nazwa jest sprawdzona.
Michael Ratanapintha
2
„ale często są napisane
wielkimi literami
3
Na przykład, jeśli serwer MS Sql jest zainstalowany przy użyciu sortowania z rozróżnianiem wielkości liter, wówczas w nazwach tabel, kolumn i zmiennych rozróżniana jest wielkość liter, nawet jeśli baza danych ma sortowanie bez rozróżniania wielkości liter.
Vadym Stetsiak,
3
@BlackTigerX - Podręczniki Oracle zawierają wszystkie przykładowe instrukcje SQL ze słowami kluczowymi (SELECT, FROM, WHERE itp.) Pisanymi wielkimi literami, ale nazwy tabel i kolumn pisane małymi literami.
J. Polfer
Hmmm, czy to nadal prawda o MySQL? Myślałem, że mam domyślną instalację mysql i nie rozróżnia wielkości liter w nazwach kolumn.
Kzqai
22

Nie jest to język ściśle SQL, ale w SQL Server, jeśli w sortowaniu bazy danych rozróżniana jest wielkość liter, to we wszystkich nazwach tabel rozróżniana jest wielkość liter.

Cade Roux
źródło
16

W Sql Server jest to opcja . Włączanie jest do bani.

Nie jestem pewien co do MySql.

JosephStyons
źródło
W MySql rozróżnianie wielkości liter jest opcją, którą można włączać i wyłączać. Tyle, że niewrażliwość nie działa tak, jak można by to założyć w systemie Linux, jeśli w systemie plików rozróżniana jest wielkość liter (domyślnie). Musisz stworzyć system plików bez rozróżniania wielkości liter w systemie Linux, aby mysql nie rozróżniał wielkości liter, aby działał tak samo jak w systemie Windows (= poprawnie). Zwłaszcza włączenie / wyłączenie po kilku pracach w innym trybie może mieć poważne konsekwencje.
Stefan Steiger
14

W identyfikatorach i słowach zastrzeżonych nie powinna być rozróżniana wielkość liter, chociaż wiele osób stosuje konwencję, aby używać wielkich liter w przypadku słów zastrzeżonych i Pascal w przypadku identyfikatorów.

Patrz SQL-92 Sec. 5.2

Dozorca więzienny
źródło
13

Specyfikacja SQL92 stwierdza, że ​​identyfikatory mogą być cytowane lub niecytowane. Jeśli obie strony nie są cytowane, to zawsze rozróżniają małe i wielkie litery, np table_name == TAble_nAmE.

Jednak w cytowanych identyfikatorach rozróżniana jest wielkość liter, np "table_name" != "TAble_naME". Również w oparciu o specyfikację, jeśli chcesz porównać identyfikatory niekwotowane z cytowanymi, wówczas identyfikatory niecytowane i cytowane można uznać za takie same, jeśli niecytowane znaki są pisane dużymi literami, np. TABLE_NAME == "TABLE_NAME", Ale TABLE_NAME != "table_name"lub TABLE_NAME != "TAble_NaMe".

Oto odpowiednia część specyfikacji (sekcja 5.2.13):

     13)A <regular identifier> and a <delimited identifier> are equiva-
        lent if the <identifier body> of the <regular identifier> (with
        every letter that is a lower-case letter replaced by the equiva-
        lent upper-case letter or letters) and the <delimited identifier
        body> of the <delimited identifier> (with all occurrences of
        <quote> replaced by <quote symbol> and all occurrences of <dou-
        blequote symbol> replaced by <double quote>), considered as
        the repetition of a <character string literal> that specifies a
        <character set specification> of SQL_TEXT and an implementation-
        defined collation that is sensitive to case, compare equally
        according to the comparison rules in Subclause 8.2, "<comparison
        predicate>".

Uwaga: podobnie jak w przypadku innych części standardu SQL, nie wszystkie bazy danych w pełni przestrzegają tej sekcji. Na przykład PostgreSQL przechowuje wszystkie niecytowane identyfikatory małymi literami zamiast wielkich liter, więc table_name == "table_name"(co jest dokładnie przeciwieństwem standardu). Również niektóre bazy danych przez cały czas nie rozróżniają wielkości liter, a rozróżnianie wielkości liter zależy od niektórych ustawień w DB lub zależą od niektórych właściwości systemu, zwykle od tego, czy w systemie plików rozróżniana jest wielkość liter.

Należy pamiętać, że niektóre narzędzia bazy danych mogą wysyłać cytowane identyfikatory przez cały czas, więc w przypadkach, w których mieszane są zapytania wygenerowane przez jakieś narzędzie (np. Zapytanie CREATE TABLE wygenerowane przez Liquibase lub inne narzędzie do migracji DB), z ręcznie wykonanymi zapytaniami (jak prosty wybór JDBC w aplikacji) musisz upewnić się, że przypadki są spójne, szczególnie w bazach danych, w których cytowane i niecytowane identyfikatory są różne (DB2, PostgreSQL itp.)

Sztuczki
źródło
10

Rozumiem, że standard SQL wymaga rozróżniania wielkości liter. Nie sądzę jednak, aby jakiekolwiek bazy danych były w pełni zgodne ze standardem.

MySQL ma ustawienie konfiguracji jako część „trybu ścisłego” (zestaw kilku ustawień, dzięki którym MySQL jest bardziej zgodny ze standardami) dla rozróżniania wielkości liter lub niewrażliwych nazw tabel. Niezależnie od tego ustawienia, nazwy kolumn nadal nie rozróżniają wielkości liter, chociaż myślę, że wpływa to na sposób wyświetlania nazw kolumn. Uważam, że to ustawienie dotyczy całej instancji, we wszystkich bazach danych w instancji RDBMS, chociaż dzisiaj badam, aby to potwierdzić (i mam nadzieję, że odpowiedź jest przecząca).

Podoba mi się, jak Oracle radzi sobie o wiele lepiej. W prostym SQL identyfikatory, takie jak nazwy tabel i kolumn, nie uwzględniają wielkości liter. Jeśli jednak z jakiegoś powodu naprawdę chcesz uzyskać jawną obudowę, możesz zawrzeć identyfikator w cudzysłowach (które są zupełnie inne w Oracle SQL od pojedynczych cudzysłowów używanych do dołączania danych łańcuchowych). Więc:

SELECT fieldName
FROM tableName;

wyśle ​​zapytanie o nazwę pola z tablename , ale

SELECT "fieldName"
FROM "tableName";

wyśle zapytanie fieldName z TableName .

Jestem prawie pewien, że możesz nawet użyć tego mechanizmu do wstawienia spacji lub innych niestandardowych znaków do identyfikatora.

W tej sytuacji, jeśli z jakiegoś powodu okaże się, że pożądane są wyraźnie zapisane w tabelach i kolumnach nazwy, jest to dla Ciebie dostępne, ale nadal byłbym czymś, przed czym powinienem bardzo uważać.

Moją konwencją, gdy codziennie korzystałem z Oracle, było to, że w kodzie wstawiałbym wszystkie słowa kluczowe Oracle SQL wielkimi literami, a wszystkie identyfikatory małymi literami. W dokumentacji umieszczałbym wszystkie nazwy tabel i kolumn dużymi literami. Było to bardzo wygodne i czytelne, aby móc to zrobić (chociaż czasem trudno było wpisać tak wiele wielkich liter w kodzie - jestem pewien, że mogłem znaleźć tutaj funkcję edytora, która by pomogła).

Moim zdaniem MySQL jest szczególnie zły, ponieważ różni się w tym zakresie na różnych platformach. Musimy być w stanie zrzucić bazy danych w systemie Windows i załadować je do systemu UNIX, a zrobienie tego jest katastrofą, jeśli instalator w systemie Windows zapomniał przełączyć RDBMS w tryb rozróżniania wielkości liter. (Szczerze mówiąc, po części przyczyną katastrofy jest to, że nasi koderzy już dawno podjęli złą decyzję, aby polegać na rozróżnianiu wielkości liter w MySQL w systemie UNIX). Ludzie, którzy napisali instalator Windows MySQL, sprawili, że było to bardzo wygodne i Podobny do systemu Windows i wspaniale było przejść do zaznaczania pola wyboru „Czy chcesz włączyć tryb ścisły i uczynić MySQL bardziej zgodnym ze standardami?” Ale bardzo wygodne jest, aby MySQL tak wyraźnie odróżniał się od standardu, a następnie pogarszają sytuację, odwracając się i różniąc od swojego faktycznego standardu na różnych platformach. Jestem pewien, że w różnych dystrybucjach Linuksa może to być jeszcze bardziej skomplikowane, ponieważ programy pakujące dla różnych dystrybucji prawdopodobnie czasami miały własne preferowane ustawienia konfiguracji MySQL.

Oto kolejne pytanie SO, które dotyczy dyskusji, czy w RDBMS pożądana jest rozróżnianie wielkości liter.

skiphoppy
źródło
5

Nie. MySQL nie rozróżnia wielkości liter, podobnie jak standard SQL. Powszechną praktyką jest pisanie poleceń dużymi literami.

Teraz, jeśli mówisz o nazwach tabel / kolumn, to tak, ale nie same polecenia.

Więc

SELECT * FROM foo;

jest taki sam jak

select * from foo;

ale nie to samo co

select * from FOO;
cmcculloh
źródło
2
W większości RDBMS nazwy tabel również nie rozróżniają wielkości liter. Przynajmniej nie domyślnie. MySQL jest najbardziej widocznym wyjątkiem od tej reguły.
4

Uważam, że ten post na blogu jest bardzo pomocny (nie jestem autorem). Podsumowując (proszę przeczytać):

... w identyfikatorach rozdzielanych rozróżniana jest wielkość liter („nazwa_tabeli”! = „nazwa_tabeli”), podczas gdy identyfikatory bez cudzysłowu nie są, i są przekształcane na wielkie litery (nazwa_tabeli => TABLE_NAME).

Odkrył, że DB2, Oracle i Interbase / Firebird są w 100% zgodne:

PostgreSQL ... zamienia małe litery na każdy niecytowany identyfikator, zamiast go zmieniać. MySQL ... zależny od systemu plików. Przypadki SQLite i SQL Server ... nazwy tabel i pól są zachowywane podczas tworzenia, ale później są całkowicie ignorowane.

Matthew Cornell
źródło
2

Nie sądzę, aby SQL Server rozróżniał wielkość liter, przynajmniej domyślnie.

Kiedy ręcznie pytam za pomocą Management Studio, cały czas robię bałagan i chętnie to akceptuje:

select cOL1, col2 FrOM taBLeName WheRE ...
Dana
źródło
2

Słowa kluczowe SQL same w sobie nie rozróżniają wielkości liter.

W nazwach tabel, kolumn itp. Rozróżniana jest wielkość liter, która jest zależna od bazy danych - prawdopodobnie powinieneś założyć, że rozróżniają małe i duże litery, chyba że wiesz inaczej (w wielu bazach danych tak nie jest; w nazwach tabel MySQL rozróżniana jest wielkość liter, ale większość innych imiona nie są).

Porównywanie danych za pomocą =,>, <itd. Ma rozpoznawanie wielkości liter, które zależy od ustawień sortowania, które są używane w poszczególnych bazach danych, tabelach, a nawet kolumnach. Jednak normalne jest, aby sortowanie było dość spójne w bazie danych. Mamy kilka kolumn, które muszą przechowywać wartości z rozróżnianiem wielkości liter; mają specjalnie ustawione sortowanie.

MarkR
źródło
0

Miej to, co najlepsze z obu światów

W dzisiejszych czasach możesz po prostu napisać wszystkie instrukcje sql małymi literami, a jeśli kiedykolwiek będziesz musiał je sformatować, po prostu zainstaluj wtyczkę, która zrobi to za Ciebie. Ma to zastosowanie tylko wtedy, gdy edytor kodu udostępnia te wtyczki. VSCode ma wiele rozszerzeń, które mogą to zrobić.

Isaac Pak
źródło