Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: działanie apostrofu
Forum PHP.pl > Forum > Bazy danych > MySQL
c4ld3ra
Wiatm, mam pytanie do znawców baz danych, gdy do zapytania dorzucam pojedynczy apostronf np.: SELECT * FROM tabela WHERE pole= 'wartosc'' ; , bądź gdziekolwiek ich nieparzystą liczbe do otrzymuje komunikat o błędzie syntaktycznym a kiedy dorzucam parzysta liczbe apostroafów to po prostu mam np.: brak wyników wyszukiwania. Mógły by ktoś mnie nakierowac na informacje dlaczego parzyta liczba apostrofów nie wywołyje błędu synkatycznego, jak sie zachowóje silnik bazodanowy. Z góry wielki dzienki.
Sephirus
Nie jestem pewien czy to takie proste - ale z tego co piszesz jako "nieparzystą" liczbę apostrofów rozumuję jako błąd.

AFAIK apostrofy zawsze powinny występować w parach stąd też - nieparzyście to błąd - wyjątkiem są oczywiście escapowane apostrofy...

Co do samego działania zasada jest chyba dość prosta - jeśli w zapytaniu wstawisz gdzieś apostrof - silnik domyśla się, że będziesz w nim wpisywał jakieś słowo klucz - nazwę tablicy, pola itp. czeka zatem na jego zakończenie. Jesli dorzucisz jakieś dwa apostrofy po sobie w zapytaniu silnik spróbuje wyciągnąć z nich jakąś nazwę - jeśli mu się uda i coś będzie nie grało to wywali błąd ale nie syntaktyczny a brak pola o podanej nazwie lub coś w tym rodzaju. Jeśli zaś apostrofy są puste to nie jest to błąd syntaktyczny smile.gif składnia się zgadza poniekąd - natomiast umieszczenie apostrofów w różnym miejscu może dać różne rezultaty. Na przykład:

  1. SELECT * FROM `tabelka`


i

  1. SELECT * FROM `tabelka` ``


Da ten sam wynik ale dokładanie większej liczby apostrofów nawet parami może przynieść dziwne rezultaty - w końcu SQL uzna, że coś w miejscu tych apostrofów powinno być i może wówczas wywalić błąd składni - na przykład:

  1. SELECT `` * FROM `tabelka`


w tym momencie zamiast `` powinna być nazwa pola - nie ma jej więc to błąd składni itd...

Ciekawe pytanie w ogóle - skąd takie?
Shili
@up
Znak ` to nie jest apostrof smile.gif

W apostrofie wpisujemy ciągi znaków (stringi). Otwarty apostrof (najprościej) oznacza, że baza danych spodziewa się ciągu znaków i zamykającego apostrofa; nie ma - błąd

znak ` to grawis lub backquote. Dużo osób myli te dwa znaki smile.gif
Grawis ogólnie służy do tego, aby w nazwach tabel i kolumn była możliwość umieszczenia słowa zastrzeżonego SQL

http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html

  1. SELECT usage FROM statistics
wygeneruje błąd, bo usage jest słowem zastrzeżonym
natomiast
  1. SELECT `usage` FROM statistics
już błędu nie wygeneruje.

Ale oczywiście zgadzam się
Cudzysłowie proste, apostrofy i grawisy powinny występować parami. Chyba że są escape'owane.
c4ld3ra
Szukam informacji jak sie zachowuje silnik BD gdy napotka np.:
  1. 'aaa' ''
bo wtedy nie otrzymuje żdanego komunikatu o błędzie, tylko ze w bazie nie ma takich danych, czy pomiedzy takimi dwoma parami apostrofów, zawierającymi jakieś dane lub nie zachodzi jakaś niejawna konkatenacja i dwa ciagi sa traktowane są jako jeden? A co do pytania Sephirusa skąd takie pytanie to po prostu natrafiłem na zagadnienie i mnie zaciekawiło dlaczego smile.gif .
barcisz
Podwójny apostrof wewnątrz stringa działa jak escapowanie pojedynczego apostrofu. Najlepiej to sprawdzić zapytaniem:

  1. SELECT 'ab''a'


Zwróci nam wynik:

ab'a
c4ld3ra
Cytat(barcisz @ 21.12.2011, 13:08:38 ) *
Podwójny apostrof wewnątrz stringa działa jak escapowanie pojedynczego apostrofu. Najlepiej to sprawdzić zapytaniem:

  1. SELECT 'ab''a'


Zwróci nam wynik:

ab'a

W moim przykładzie jest odstęp pomiędzy kolejnymi apostrofami, wiec sie nie wyeskejpują, szukam informacji jak sie traktowane są tego rodzaju ciągi znaków.
Shili
Zachodzi konkatenacja.

'a' 'b' da Ci ciąg ab

Z tym że:

'ab' '' również powinno zwrócić ab.

Więc:
  1. SELECT * FROM tabela WHERE name = 'marysia'

=
  1. SELECT * FROM tabela WHERE name = 'mar' 'ysia'


Przynajmniej w teorii.
U mnie działa zupełnie poprawnie. Żadnego braku nie stwierdziłam.
toaspzoo
zamieniaj ' na \'
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.