![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Witajcie,
mam kilka pytań/wątpliwości odnośnie zapisu adresu IP w bazie danych. Wypunktuję, żeby był porządek ![]()
Liczę na gorącą dyskusję ![]() Ten post edytował SmokAnalog 17.09.2013, 12:19:24 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 2 355 Pomógł: 533 Dołączył: 15.01.2010 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Zawsze mnie zastanawiało skąd mnóstwo dyskusji i zapytań o to jak zapisywać IP. Co w nim jest takiego wyjątkowego, że nie można go zapisać jako najzwyklejszy string?
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Można, tylko po co? Liczbę znaków używanych przez adres IP można policzyć na palcach obu rąk. Najzwyklejsze w świecie marnotrawstwo miejsca w bazie. Oczywiście jeśli mamy kilka(set) rekordów to żadne kotki nie ucierpią, ale przy milionach to już jest spora różnica. Nie zawsze droga na skróty i najprostsze rozwiązania są najlepsze.
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 2 355 Pomógł: 533 Dołączył: 15.01.2010 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
To wszystko zależy od tego w jakim kontekście wykorzystujemy to ip (może jakaś zaawansowana geolokalizacja po ip, wtedy można by pomyśleć o optymalizacji), ale w 95% przypadków wg mnie to jest tylko sztuka dla sztuki. Można mnie zbesztać i zasypać rzeczowymi argumentami, jeśli głoszę herezję
![]() |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
@Damonsson: Bo adres IP to tak naprawdę liczba, a nie string (np. http://1167283143 ).
@SmokAnalog: Ten sposób jest chyba najlepszy, jeśli chodzi o IPv6. (MySQL od wersji 5.6 zawiera funkcje do IPv6 jak np. INET6_ATON i operują one też na VARBINARY(16). -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
To wszystko zależy od tego w jakim kontekście wykorzystujemy to ip (może jakaś zaawansowana geolokalizacja po ip, wtedy można by pomyśleć o optymalizacji), ale w 95% przypadków wg mnie to jest tylko sztuka dla sztuki. Można mnie zbesztać i zasypać rzeczowymi argumentami, jeśli głoszę herezję ![]() Nie rozumiem co ma jedno do drugiego ![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Co prawda nie wspomniano nic o konkretnym silniku bazy danych, ale w MySQL sprawa jest o tyle nieciekawa, że bazie tej brakuje dobrego wsparcia dla przechowywania adresów IP i niestety trzeba się ratować ogólnym typem binarnym, np. VARBINARY(16). Jednak, gdy w przyszłości w końcu poprawią ten aspekt, nie będzie żadnego problemu z migracją. W innych baza danych, w miarę możliwości korzystaj z dedykowanego typu dla adresów, np. w przypadku Postgresa będzie to typ inet
1. Wszystkie adresy IPv4 konwertuj do IPv6. Łatwiej jest pracować nad pojedynczym modelem danych. Ewentualnie tuż przed wyświetleniem gdzieś tego adresu możesz sprawdzić czy jest to v4 i zaprezentować go w takiej właśnie formie. 2. Po stronie PHP przydatne będzie inet_pton oraz inet_ntop. @Damonsson: Jeżeli interesuje Cię jedynie zapisanie i odczytanie adresu, to zapisywanie jako tekst jeszcze przejdzie, ale jeżeli chcesz z tymi danymi zrobić cokolwiek innego będzie to stwarzało sporo problemów. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
1. Wszystkie adresy IPv4 konwertuj do IPv6. Łatwiej jest pracować nad pojedynczym modelem danych. Ewentualnie tuż przed wyświetleniem gdzieś tego adresu możesz sprawdzić czy jest to v4 i zaprezentować go w takiej właśnie formie. Rozumiem, że inet_pton sam się tym zajmie, prawda? Proszę jeszcze o odpowiedź w sprawie PDO::PARAM_LOB, bo nie ukrywam, że to mnie najbardziej intryguje. Ten post edytował SmokAnalog 17.09.2013, 13:06:08 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli masz adres IPv4 jego najprostszym odpowiednim w IPv6 jest dokładnie ten sam ciąg poprzedzony dwoma dwukropkami:
Kod 123.123.123.123 - IPv4 Funkcje inet_*() powinny rozumieć taką konstrukcję.::123.123.123.123 - IPv6 Co do PDO::PARAM_LOB to w większości przypadków nie będzie miało znaczenia z czego skorzystasz, ale tak, _LOB to dobre rozwiązanie. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 01:12 |