2008-11-04 11 views
146

Po przeczytaniu kilku odpowiedzi i komentarzy na temat niektórych pytań SQL tutaj, a także usłyszeć, że mój przyjaciel pracuje w miejscu, które ma politykę, która je zakazuje, zastanawiam się, czy coś jest nie tak z wykorzystaniem backticków wokół nazw pól w MySQL.Używanie ukośników wokół nazw pól

Czyli:

SELECT `id`, `name`, `anotherfield` ... 
-- vs -- 
SELECT id, name, anotherfield ... 
+16

backticks są bardzo przydatne, jeśli chcesz mieć nazwy kolumn, jak '' type' count', 'table' lub podobny – knittl

+0

zobaczyć również http://stackoverflow.com/questions/23446377/syntax-error- z powodu użycia-a-zarezerwowanego-słowa-jako-tabeli-lub-kolumny-nazwy-w-mysql –

Odpowiedz

136

Użycie przycisków cofania umożliwia użycie znaków alternatywnych. W zapytaniu pisanie to nie jest taki problem, ale jeśli ktoś zakłada, że ​​może po prostu użyć odwrócone, pojedyncze apostrofy, to zakładam, że pozwala uciec z śmiesznej rzeczy jak

SELECT `id`, `my name`, `another field` , `field,with,comma` 

która robi oczywiście generować źle nazwanych tabel.

Jeśli jesteś po prostu zwięzły Nie widzę problemu z tym, będziesz pamiętać, jeśli uruchomić kwerendę jako taki

EXPLAIN EXTENDED Select foo,bar,baz 

Wygenerowany ostrzegawczym, że wróci będzie miał back- tyknięcia i w pełni kwalifikowanych nazw tabel. Jeśli więc używasz funkcji generowania zapytań i automatycznego ponownego wpisywania zapytań, cofnięcia sprawią, że cokolwiek analizować będzie Twój kod mniej zagubiony.

Myślę jednak, że zamiast nakazać, czy można używać zwrotnych, powinny one mieć standard dla nazw. Rozwiązuje bardziej "prawdziwe" problemy.

+0

Czy musimy ich używać również w PostgreSQL? –

+4

Nie ma potrzeby, tylko zalecenia. Przydatne jest reprezentowanie ich w celu uniknięcia niejednoznaczności ze słowami kluczowymi SQL, jeśli w przyszłości zostanie dodane słowo kluczowe SQL, które udostępnia nazwę pola. Jedyny przypadek, w którym należy/trzeba/zacytować, to pole, w którym słowo "nie" współdzieli nazwę słowa kluczowego, na przykład "wybierz liczbę z foo" zamiast "wybierz" liczbę "z foo" da bardzo różne wyniki. Ale postgres różni się od mysql na 2 sposoby: 1. Pola są cytowane przez "" ". 2. W polach niecytowanych nie jest uwzględniana wielkość liter http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS –

4

Cóż, o ile mi wiadomo, głównym celem jest odwrócone, pojedyncze apostrofy użyciu, dzięki czemu można używać nazw, które pokrywają się z zastrzeżonych słów kluczowych. Jeśli więc nazwa nie koliduje z zastrzeżonym słowem kluczowym, nie widzę powodu, aby używać zwrotnych. Ale to też nie jest powód, żeby ich zakazać.

41

Dla mnie bardzo sensowne jest ich używanie przez cały czas, gdy mamy do czynienia z nazwami pól.

  • Po pierwsze, gdy już wejdzie się w nawyk, nie zaszkodzi po prostu nacisnąć klawisz zwrotny.
  • Po drugie, dla mnie łatwiej jest zobaczyć, jakie dokładnie są pola w zapytaniu i jakie są słowa kluczowe lub metody.
  • Wreszcie pozwala na użycie nazwy dowolnego pola podczas projektowania stołu. Czasem warto nadać polu "klucz", "porządek" lub "wartości", z których wszystkie wymagają odsyłaczy w odniesieniu do nich.
+14

Powinieneś również dodać, że chroni cię przed wszelkimi używanymi w przyszłości słowami zastrzeżonymi (które mnie wcześniej ugryzło) . – alex

+5

Naprawdę miałam kogoś, kto raz edytował dodatkowe backticks z jednego z moich pytań, co mnie denerwuje, ponieważ to powód jest powodem, dla którego otaczam każdą zmienną nimi –

+2

Pozwala to również na bezpieczne użycie etykiet nieangielskich, które same w sobie wystarczą aby zachęcić do użycia backticków. – Aternus

48

Jedynym problemem z cofnięciami jest to, że nie są zgodne z ANSI-SQL, np. nie działają w SQL Server.

Jeśli istnieje szansa, że ​​będziesz musiał przenieść swój SQL do innej bazy danych, użyj podwójnego cudzysłowu.

+13

Tak. Użyj trybu ANSI MySQL - http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - aby włączyć podwójne cudzysłowy w MySQL, a tym samym odzyskać kompatybilność z bazami danych. Backticks/quotes są również konieczne, ponieważ nigdy nie wiesz, co stanie się zastrzeżonym słowem w przyszłych wersjach DBMS. – bobince

+1

To prawda! Jedna z naszych aplikacji serwerowych działała poprawnie, dopóki nie zastosowaliśmy aktualizacji do naszego silnika bazy danych, który dodał nowe słowo kluczowe. Nagle wszystko, co przepytało konkretny stół, pękło. – Miquella

+0

@bobince Kiedy byłem * nowy * dla dev, nazwałem kolumnę 'range' lub coś podobnego. Po aktualizacji do MySQL 5 nie udało się, ponieważ było to nowe zarezerwowane słowo! – alex

20

Cofa się nie są częścią standardowego ANSI SQL.Od the mysql manual:

Jeśli tryb ANSI_QUOTES SQL włączoną, jest również dopuszczalna zacytować identyfikatory wewnątrz cudzysłowów

Więc jeśli używasz odwrócone, pojedyncze apostrofy, a następnie zdecydować się odejść z MySQL, ty mam problem (chociaż prawdopodobnie masz o wiele większe problemy)

7

Nie ma nic złego, jeśli nadal używasz MYSQL-a, może poza wizualnym rozmytością zapytań. Ale pozwalają na użycie zarezerwowanych słów kluczowych lub osadzonych spacji jako nazw tabel i kolumn. Jest to nie-nie w większości silników baz danych i uniemożliwi migrację w późniejszym czasie.

Co do łatwego czytania, wiele osób używa czapek dla słów kluczowych SQL, np.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL; 
6

Dużo łatwiej jest przeszukać bazę kodu pod kątem czegoś w odbiciach. Powiedzmy, że masz tabelę o nazwie event. grep -r "event" * może zwrócić setki wyników. grep -r "\`event\`" * zwróci wszystko, co prawdopodobnie odwołuje się do bazy danych.

+0

Ogólnie rzecz biorąc nie jest to naprawdę korzystne. Tabele, na które napotkasz profesjonalnie, są nazywane bardziej jak new_users_info niż "general". – dotslash

5

Jeśli o mnie pytasz, zawsze powinny być używane tylne linki. Ale są pewne powody, dla których zespół może nie chcieć ich nie używać.

Zalety:

  • Korzystanie z nich nie ma zarezerwowanych słów lub zakazanych znaków.
  • W niektórych przypadkach pojawia się więcej opisowych komunikatów o błędach.
  • Jeśli unikniesz złych praktyk, nie obchodzi cię to, ale ... w prawdziwym słowie, czasami są dobrym sposobem na uniknięcie zastrzyków SQL.

Wady:

  • Oni nie są standardowe i zwykle nie przenośne. Jednak dopóki nie użyjesz odwrotnego fragmentu jako części identyfikatora (co jest najgorszą praktyką, jaką jestem w stanie sobie wyobrazić), możesz przesłać zapytanie przez automatyczne usunięcie zwrotów.
  • Jeśli niektóre zapytania pochodzą z programu Access, mogą podawać nazwy tabel za pomocą "(a może nie można usunąć wszystkich" na ślepo). Dopuszcza się jednak mieszaniny zwrotów i podwójnych cudzysłowów.
  • Niektóre głupie oprogramowanie lub funkcja filtruje zapytania i ma problemy z odsunięciami. Są one jednak częścią ASCII, więc oznacza to, że twoje oprogramowanie/funkcja jest bardzo złe.
+7

Korzystanie z przycisków backticks nie ma absolutnie nic wspólnego z unikaniem zastrzyków SQL. –

+5

@andy to ** może ** pomóc, ponieważ atakujący musi zamknąć to z innym backtick by wstrzyknąć. To niewiele, ale to wciąż coś. – jasonszhao

0

jeśli używasz kilka nazw pól jako domyślny MySQL lub MSSQL wartości na przykład „status”, trzeba użyć odwrócone, pojedyncze apostrofy („wybierz status z table_name” lub „wybrać identyfikator z table_name gdzie status = 1”). ponieważ mysql zwraca błędy lub nie wykonuje zapytania.

1

prosta sprawa o grawis ` jest wykorzystanie do identyfikatora oznaczają podobne bazą danych, table_name etc, a pojedynczy cudzysłów „”, cudzysłów „” dla napisowych, natomiast„”użyć do wartości druku, jak to jest i '' drukuje zmienną wartości hold lub w innym przypadku drukuje tekst, który posiada.

i.e 1.-> use `model`; 
    here `model` is database name not conflict with reserve keyword 'model' 
2- $age = 27; 
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi"); 

here i used both quote for all type of requirement. If anything not clear let me know.. 
+0

Teraz wszystko jest w porządku, zobacz uważnie .. –

Powiązane problemy