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?
sql
case-sensitive
Steve Tranby
źródło
źródło
Odpowiedzi:
SQL Słowa kluczowe są wielkości liter (
SELECT
,FROM
,WHERE
itp), 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
źródło
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.
źródło
W Sql Server jest to opcja . Włączanie jest do bani.
Nie jestem pewien co do MySql.
źródło
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
źródło
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"
, AleTABLE_NAME != "table_name"
lubTABLE_NAME != "TAble_NaMe"
.Oto odpowiednia część specyfikacji (sekcja 5.2.13):
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.)
źródło
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:
wyśle zapytanie o nazwę pola z tablename , ale
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.
źródło
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
jest taki sam jak
ale nie to samo co
źródło
Uważam, że ten post na blogu jest bardzo pomocny (nie jestem autorem). Podsumowując (proszę przeczytać):
Odkrył, że DB2, Oracle i Interbase / Firebird są w 100% zgodne:
źródło
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:
źródło
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.
źródło
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ć.
źródło