{"id":88581,"date":"2020-07-15T01:42:09","date_gmt":"2020-07-14T23:42:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/unreal-features-of-real-types-ili-budte-ostorozhny-s-real"},"modified":"2020-07-15T01:42:09","modified_gmt":"2020-07-14T23:42:09","slug":"unreal-features-of-real-types-ili-budte-ostorozhny-s-real","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/unreal-features-of-real-types-ili-budte-ostorozhny-s-real","title":{"rendered":"Niezwyk\u0142e cechy prawdziwych typ\u00f3w, czyli Uwa\u017caj na REAL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Po publikacji <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/508038\/\">artyku\u0142u<\/a><\/noindex> na temat typizacji w PostgreSQL, pierwszy komentarz dotyczy\u0142 trudno\u015bci w pracy z liczbami rzeczywistymi. Postanowi\u0142em szybko przejrze\u0107 dost\u0119pny mi kod zapyta\u0144 SQL, aby zobaczy\u0107, jak cz\u0119sto typ REAL jest w nich u\u017cywany. Okaza\u0142o si\u0119, \u017ce jest on u\u017cywany do\u015b\u0107 cz\u0119sto, a deweloperzy nie zawsze rozumiej\u0105 zwi\u0105zane z nim zagro\u017cenia. I to pomimo \u017ce w Internecie oraz na Habrze mo\u017cna znale\u017a\u0107 sporo dobrych artyku\u0142\u00f3w o zasadach przechowywania liczb rzeczywistych w pami\u0119ci maszyny i pracy z nimi. Dlatego w tym artykule postaram si\u0119 zastosowa\u0107 te zasady do PostgreSQL i postaram si\u0119 \u201ena palcach\u201d om\u00f3wi\u0107 zwi\u0105zane z nimi problemy, aby u\u0142atwi\u0107 deweloperom zapyta\u0144 SQL ich unikanie.<\/p>\n<p><\/p>\n<p>Dokumentacja PostgreSQL zawiera zwi\u0119z\u0142e stwierdzenie: \u201eZarz\u0105dzanie takimi b\u0142\u0119dami i ich propagacja podczas oblicze\u0144 jest przedmiotem ca\u0142ego dzia\u0142u matematyki i informatyki i nie b\u0119dzie tutaj omawiane\u201d (z rozs\u0105dkiem odsy\u0142aj\u0105c czytelnika do standardu IEEE 754). Jakie b\u0142\u0119dy s\u0105 tutaj na my\u015bli? Om\u00f3wmy je po kolei, a szybko stanie si\u0119 jasne, dlaczego zn\u00f3w wzi\u0105\u0142em si\u0119 za pi\u00f3ro.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>We\u017amy na przyk\u0142ad proste zapytanie:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">********* ZAPYTANIE *********\nSELECT 0.1::REAL;\n****************************\nfloat4\n--------\n    0.1\n(1 wiersz)\n<\/code><\/pre>\n<p><\/p>\n<p>W rezultacie nie zobaczymy nic szczeg\u00f3lnego \u2013 otrzymamy oczekiwan\u0105 warto\u015b\u0107 0.1. Ale teraz por\u00f3wnajmy j\u0105 z 0.1:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">********* ZAPYTANIE *********\nSELECT 0.1::REAL = 0.1;\n****************************\n?kolumna?\n----------\nf\n(1 wiersz)\n<\/code><\/pre>\n<p><\/p>\n<p>Nie s\u0105 r\u00f3wne! Co za cuda! Ale to jeszcze nie koniec. Kto\u015b powie, \u017ce wie, i\u017c REAL \u017ale zachowuje si\u0119 z u\u0142amkami, wi\u0119c b\u0119d\u0119 wprowadza\u0107 tam liczby ca\u0142kowite, z nimi na pewno wszystko b\u0119dzie dobrze. Dobrze, przekszta\u0142\u0107my liczb\u0119 123&nbsp;456&nbsp;789 do typu REAL:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">********* ZAPYTANIE *********\nSELECT 123456789::REAL::INT;\n****************************\n   int4   \n-----------\n123456792\n(1 wiersz)\n<\/code><\/pre>\n<p><\/p>\n<p>I wysz\u0142o wi\u0119cej o 3! Ca\u0142a baza ostatecznie zapomnia\u0142a liczy\u0107! Czy mo\u017ce czego\u015b nie rozumiemy? Zobaczmy.<\/p>\n<p><\/p>\n<p>Na pocz\u0105tek przypomnijmy sobie podstawy. Jak wiadomo, ka\u017cd\u0105 liczb\u0119 dziesi\u0119tn\u0105 mo\u017cna przedstawi\u0107 w postaci pot\u0119g dziesi\u0119ciu. Tak wi\u0119c liczba 123.456 b\u0119dzie r\u00f3wna 1*10\u00b2 + 2*10\u00b9 + 3*10\u2070 + 4*10\u207b\u00b9 + 5*10\u207b\u00b2 + 6*10\u207b\u00b3. Jednak komputer operuje liczbami w systemie binarnym, dlatego musimy je przedstawi\u0107 jako sum\u0119 pot\u0119g dw\u00f3jki. Dlatego liczba 5.625 w postaci binarnej to 101.101 i b\u0119dzie r\u00f3wna 1*2\u00b2 + 0*2\u00b9 + 1*2\u2070 + 1*2\u207b\u00b9 + 0*2\u207b\u00b2 + 1*2\u207b\u00b3. I podczas gdy dodatnie pot\u0119gi dw\u00f3jki zawsze daj\u0105 ca\u0142kowite liczby dziesi\u0119tne (1, 2, 4, 8, 16 itd.), to z pot\u0119gami ujemnymi sprawa jest bardziej skomplikowana (0.5, 0.25, 0.125, 0.0625 itd.). Problem polega na tym, \u017ce <b>nie ka\u017cd\u0105 dziesi\u0119tn\u0105 u\u0142amkow\u0105 mo\u017cna przedstawi\u0107 w formie sko\u0144czonego u\u0142amka binarnego<\/b>. Tak wi\u0119c, nasze nieszcz\u0119sne 0.1 jako u\u0142amek binarny przyjmuje posta\u0107 okresow\u0105 0.0(0011). W zwi\u0105zku z tym ko\u0144cowa warto\u015b\u0107 tej liczby w pami\u0119ci maszyny b\u0119dzie si\u0119 zmienia\u0107 w zale\u017cno\u015bci od rozmiaru bit\u00f3w.<\/p>\n<p><\/p>\n<p>Teraz nadszed\u0142 czas, aby przypomnie\u0107 sobie, jak liczby rzeczywiste s\u0105 przechowywane w pami\u0119ci komputera. M\u00f3wi\u0105c og\u00f3lnie, liczba rzeczywista sk\u0142ada si\u0119 z trzech g\u0142\u00f3wnych cz\u0119\u015bci \u2013 znaku, mantysy i wyk\u0142adnika. Znak mo\u017ce by\u0107 albo plus, albo minus, dlatego zajmuje jeden bit. Natomiast liczba bit\u00f3w mantysy i wyk\u0142adnika jest okre\u015blona przez typ liczby rzeczywistej. Dla typu REAL d\u0142ugo\u015b\u0107 mantysy wynosi 23 bity (jeden bit, r\u00f3wny 1, jest implicitnie dodawany na pocz\u0105tku mantysy, co daje 24), a wyk\u0142adnika \u2013 8 bit\u00f3w. W sumie daje to 32 bity, czyli 4 bajty. Dla typu DOUBLE PRECISION d\u0142ugo\u015b\u0107 mantysy wynosi ju\u017c 52 bity, a wyk\u0142adnika \u2013 11 bit\u00f3w, co daje \u0142\u0105cznie 64 bity, czyli 8 bajt\u00f3w. PostgreSQL nie obs\u0142uguje wi\u0119kszej precyzji dla liczb zmiennoprzecinkowych.<\/p>\n<p><\/p>\n<p>Zaprojektujmy nasz\u0105 liczb\u0119 0.1 w postaci dziesi\u0119tnej w obu typach \u2013 REAL i DOUBLE PRECISION. Poniewa\u017c znak i warto\u015b\u0107 wyk\u0142adnika s\u0105 takie same, skupmy si\u0119 na mantysie (\u015bwiadomie pomijam mniej oczywiste cechy przechowywania warto\u015bci wyk\u0142adnika i zerowych liczb rzeczywistych, poniewa\u017c mog\u0105 utrudnia\u0107 zrozumienie i odwraca\u0107 uwag\u0119 od sedna problemu; je\u015bli chcesz, zajrzyj do standardu IEEE 754). Co otrzymamy? W g\u00f3rnej linii podam \u201emantys\u0119\u201d dla typu REAL (uwzgl\u0119dniaj\u0105c zaokr\u0105glenie ostatniego bitu do 1 do najbli\u017cszej reprezentowalnej liczby, w przeciwnym razie otrzymamy 0.099999\u2026), a w dolnej \u2013 dla typu DOUBLE PRECISION:<\/p>\n<p><\/p>\n<blockquote><p><b>0.0001<\/b>1001100110011001100110<b>1<\/b><br \/>\n<b>0.0001<\/b>1001100110011001100110011001100110011001100110011001\n<\/p><\/blockquote>\n<p><\/p>\n<p>Oczywi\u015bcie, \u017ce to dwie zupe\u0142nie r\u00f3\u017cne liczby! Dlatego przy por\u00f3wnaniu pierwsza liczba zostanie uzupe\u0142niona zerami i w konsekwencji b\u0119dzie wi\u0119ksza od drugiej (z uwzgl\u0119dnieniem zaokr\u0105glenia \u2013 pogrubionej jedynki). To wyja\u015bnia niejednoznaczno\u015bci w naszych przyk\u0142adach. W drugim przyk\u0142adzie wyra\u017anie wskazana liczba 0.1 zostaje przekszta\u0142cona do typu DOUBLE PRECISION, po czym por\u00f3wnywana jest z liczb\u0105 typu REAL. Oba s\u0105 przekszta\u0142cane do jednego typu, a wi\u0119c mamy dok\u0142adnie to, co widzimy powy\u017cej. Zmienimy zapytanie, aby wszystko stan\u0119\u0142o na swoim miejscu:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">********* ZAPYTANIE *********\nSELECT 0.1::REAL &gt; 0.1::DOUBLE PRECISION;\n**************************\n?kolumna?\n----------\nt\n(1 wiersz)\n<\/code><\/pre>\n<p><\/p>\n<p>I rzeczywi\u015bcie, wykonuj\u0105c podw\u00f3jne przekszta\u0142cenie liczby 0.1 do REAL i DOUBLE PRECISION otrzymujemy odpowied\u017a na zagadk\u0119:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">********* ZAPYTANIE *********\nSELECT 0.1::REAL::DOUBLE PRECISION;\n**************************\n\n      float8       \n-------------------\n0.100000001490116\n(1 wiersz)\n<\/code><\/pre>\n<p><\/p>\n<p>To samo wyja\u015bnia trzeci przyk\u0142ad z wymienionych powy\u017cej. Liczba 123&nbsp;456&nbsp;789 po prostu <b>nie mo\u017ce by\u0107 pomieszczona w 24 bitach mantysy<\/b> (23 jawne + 1 domy\u015blny). Najwi\u0119ksza liczba ca\u0142kowita, kt\u00f3r\u0105 mo\u017cna umie\u015bci\u0107 w 24 bitach, wyniesie 224-1 = 16&nbsp;777&nbsp;215. Dlatego nasza liczba 123&nbsp;456&nbsp;789 zaokr\u0105gla si\u0119 do najbli\u017cszej reprezentowalnej warto\u015bci 123&nbsp;456&nbsp;792. Zmieniaj\u0105c typ na DOUBLE PRECISION, nie zobaczymy ju\u017c takiego scenariusza:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">********* ZAPYTANIE *********\nSELECT 123456789::DOUBLE PRECISION::INT;\n**************************\n   int4   \n-----------\n123456789\n(1 wiersz)\n<\/code><\/pre>\n<p><\/p>\n<p>I to wszystko. Okazuje si\u0119, \u017ce \u017cadnych cud\u00f3w. Ale wszystko to jest dobrym powodem do zastanowienia si\u0119, jak bardzo rzeczywi\u015bcie potrzebny jest wam typ REAL. By\u0107 mo\u017ce najwi\u0119ksz\u0105 zalet\u0105 jego u\u017cycia jest szybko\u015b\u0107 oblicze\u0144 z oczywist\u0105 utrat\u0105 precyzji. Ale czy b\u0119dzie to uniwersalny scenariusz, kt\u00f3ry usprawiedliwia tak cz\u0119ste stosowanie tego typu? Nie s\u0105dz\u0119.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/508350\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 PostgreSQL, \u043f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0431\u044b\u043b \u043f\u0440\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438. \u042f \u0440\u0435\u0448\u0438\u043b \u0431\u0435\u0433\u043b\u043e \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043a\u043e\u0434\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043c\u043d\u0435 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u043e \u0432 \u043d\u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f REAL. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0437\u0430 \u043d\u0438\u043c. \u0418 \u044d\u0442\u043e \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-88581","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u043e\u0441\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 PostgreSQL, \u043f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0431\u044b\u043b \u043f\u0440\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/unreal-features-of-real-types-ili-budte-ostorozhny-s-real\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Unreal Features of Real Types, \u0438\u043b\u0438 \u0411\u0443\u0434\u044c\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b \u0441 REAL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u043e\u0441\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 PostgreSQL, \u043f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0431\u044b\u043b \u043f\u0440\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/unreal-features-of-real-types-ili-budte-ostorozhny-s-real\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-14T23:42:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-14T23:42:09+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Niezwyk\u0142e cechy typ\u00f3w rzeczywistych, czyli Uwa\u017caj na REAL | ProHoster","description":"Po opublikowaniu artyku\u0142u na temat specyfiki typizacji w PostgreSQL, pierwszy komentarz dotyczy\u0142 trudno\u015bci zwi\u0105zanych z.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/unreal-features-of-real-types-ili-budte-ostorozhny-s-real","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Unreal Features of Real Types, \u0438\u043b\u0438 \u0411\u0443\u0434\u044c\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b \u0441 REAL | ProHoster","og:description":"\u041f\u043e\u0441\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 PostgreSQL, \u043f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0431\u044b\u043b \u043f\u0440\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/unreal-features-of-real-types-ili-budte-ostorozhny-s-real","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-14T23:42:09+00:00","article:modified_time":"2020-07-14T23:42:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"88581","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:10:53","updated":"2022-10-03 00:47:31","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/88581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=88581"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/88581\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=88581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=88581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=88581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}