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?
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?
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
W Sql Server jest to opcja . Włączanie jest do bani.
Nie jestem pewien co do MySql.
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
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.)
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.
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;
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.
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.
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ć.