<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ManCanDo - PhP, MySQL, DIY, porady i triki &#187; &#187; bazy danych</title>
	<atom:link href="http://www.mancando.pl/tag/bazy-danych/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mancando.pl</link>
	<description>Co kupować a czego nie? Ciekawostki z zakresu programowania w PHP. Sztuczki i kruczki MySQL. Zagadnienia z zakresu grafiki komputerowej. Opisy ciekawych rzeczy, które można wykonać samodzielnie.</description>
	<lastBuildDate>Thu, 05 Dec 2013 18:50:19 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>Od XLS do CSV &#8211; szybki wsad do bazy danych MySQL</title>
		<link>http://www.mancando.pl/od-xls-do-csv-szybki-wsad-do-bazy-danych-mysql/</link>
		<comments>http://www.mancando.pl/od-xls-do-csv-szybki-wsad-do-bazy-danych-mysql/#comments</comments>
		<pubDate>Fri, 04 Oct 2013 12:21:28 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[MyAdmin]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[xls]]></category>

		<guid isPermaLink="false">http://www.mancando.pl/?p=359</guid>
		<description><![CDATA[Są takie sytuacje gdy wymagane jest wykonanie szybkiego wsadu danych do tabeli. Oczywiście można na prędce stworzyć odpowiedni skrypt PhP, który przetworzy dane wsadowe do postaci zapytań SQL. Jednak nie zawsze ma to uzasadnienie i nie zawsze ilość czasu jest &#8230; <a href="http://www.mancando.pl/od-xls-do-csv-szybki-wsad-do-bazy-danych-mysql/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[
<!-- Easy Plugin for AdSense V7.51 -->
<!-- [leadin: 2 urCount: 2 urMax: 0] -->
<div class="ezAdsense adsense adsense-leadin" style="text-align:center;margin:20px 0px;"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- mancando-poziomy -->
<ins class="adsbygoogle"
     style="display:inline-block;width:728px;height:90px"
     data-ad-client="ca-pub-2234288553315702"
     data-ad-slot="2233930472"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script></div>
<!-- Easy Plugin for AdSense V7.51 -->
<p><img class="alignright size-full wp-image-51" style="border: 0px none;" alt="komputerek_mysql" src="http://www.mancando.pl/wp-content/uploads/2013/01/komputerek_mysql.png" width="70" height="68" />Są takie sytuacje gdy wymagane jest wykonanie szybkiego wsadu danych do tabeli. Oczywiście można na prędce stworzyć odpowiedni skrypt PhP, który przetworzy dane wsadowe do postaci zapytań SQL. Jednak nie zawsze ma to uzasadnienie i nie zawsze ilość czasu jest wystarczająca na stworzenie takiego mechanizmu.</p>
<p>Właśnie w takich sytuacjach przydatna może być <img class="alignright size-full wp-image-44" style="border: 0px none;" alt="komputerek" src="http://www.mancando.pl/wp-content/uploads/2013/01/komputerek.png" width="70" height="50" />kombinacja dwóch narzędzi: phpMyadmin i &#8230; to nie żart Ms Excel. Arkusz kalkulacyjny posłuży nam jako narzędzie do preparowania odpowiednio sformatowanego pliku CSV. Phpmyadmin posłuży nam natomiast do wykonania natychmiastowego wsadu do bazy.</p>
<p><span id="more-359"></span></p>
<p style="text-align: center;"><img class="size-full wp-image-358 aligncenter" alt="wsad1" src="http://www.mancando.pl/wp-content/uploads/2013/10/wsad1.jpg" width="408" height="695" /></p>
<p>Na potrzeby tego tutorialu stworzę wirtualną potrzebę wykonania wsadu do tabeli o poniższym wyglądzie</p>
<p><code>id_kw (int) AUTO_INCREMENT<br />
name (varchar)<br />
cond (int)</code></p>
<p>Jako wsad wykorzystany będzie plik xls zwierający kilkaset słów kluczowych.<br />
W pierwszej kolejności wymagane jest odpowiednie sformatowanie pliku xls, do takiej postaci odzwierciedlającej strukturę tabeli. Pierwsza kolumna musi pozostać pusta &#8211; jest to kolumna odpowiadająca polu identyfikatora id_kw. W trzeciej kolumnie możemy dodać wartość początkową pola cond, lub pozostawić ją pustą w przypadku, gdy w strukturze tabeli określona jest wartość domyślna. Ja pozostawiam to pole puste.</p>
<p>Kolejnym etapem jest dodanie obrysu do wszystkich komórek arkusza odpowiadających wartościom pól tabeli. Zaznaczcie w Excelu &#8222;zawartość&#8221; tabeli a następnie zwykły obrys, efekt powinien być taki jak poniżej.</p>
<p style="text-align: center;"><img class="size-full wp-image-357 aligncenter" alt="wsad2" src="http://www.mancando.pl/wp-content/uploads/2013/10/wsad2.jpg" width="407" height="708" /></p>
<p>Na tym etapie może Was nieco dziwić to postępowanie jednak za chwilę zrozumiecie sens takiego działania. Zapiszcie bieżącą postać jako plik csv rozdzielany przecinkami (czytajcie uważnie pytania zadawane przez Excel i odpowiadajcie mądrze :D).</p>
<p>Otrzymany plik otwórzcie za pomocą jakiegoś edytora (najlepiej takiego który pozwala kontrolować kodowanie znaków). Pierwsze co pewnie zauważycie to fakt, że CSV rozdzielany przecinkami &#8230; jest rozdzielany średnikami (szczegół <img src="http://www.mancando.pl/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> ). Obrysowanie dodatkowej pustej kolumny spowodowało, że po słowach kluczowych pojawił się dodatkowy średnik, który odpowiada polu cond.</p>
<p>Plik w obecnej postaci nie pozwoli Wam wykonać prawidłowego wsadu, jego kodowanie jest w ANSI. Przy bazie danych z kodowaniem UTF spowoduje oczywiście błędne wyświetlanie polskich krzaczków. Zmieńcie kodowanie znaków w pliku i zapiszcie go ponownie.</p>
<p>Przejdźmy teraz do phpMyadmina w którym wykonamy właściwy import danych. Wybierzcie odpowiednią tabele z bazy danych a następnie naciśnijcie zakładkę Import. W polu format wybierzcie CSV. Następnie musicie zmienić dolne opcje &#8211; Kolumny oddzielone: ustawcie ; . Pozostałe opcje możecie zostawić bez zmian. Naciśnijcie przycisk wykonaj &#8230; tabela zostanie wypełniona danymi. I gotowe … prawda, że szybko!</p>

<!-- Easy Plugin for AdSense V7.51 -->
<!-- [leadout: 3 urCount: 3 urMax: 0] -->
<div class="ezAdsense adsense adsense-leadout" style="text-align:center;margin:12px;"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- mancando-poziomy -->
<ins class="adsbygoogle"
     style="display:inline-block;width:728px;height:90px"
     data-ad-client="ca-pub-2234288553315702"
     data-ad-slot="2233930472"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script></div>
<!-- Easy Plugin for AdSense V7.51 -->
]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/od-xls-do-csv-szybki-wsad-do-bazy-danych-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kaskadowe usuwanie rekordów w MySQL (mechanizm składowania InnoDB)</title>
		<link>http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/</link>
		<comments>http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/#comments</comments>
		<pubDate>Fri, 18 Jan 2013 11:43:20 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://mancando.pl/?p=15</guid>
		<description><![CDATA[Wielu programistów korzystających w swoich projektach z tandemu złożonego z PHP i MySQL poświęca swój czas na programową obsługę integralności danych znajdujących się w bazie. Jest oczywiście całkiem duże grono osób, które zupełnie nie zaprzątają sobie tym głowy. Śmietnik w &#8230; <a href="http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-51" style="border: 0px none;" alt="komputerek_mysql" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_mysql.png" width="70" height="68" />Wielu programistów korzystających w swoich projektach z tandemu złożonego z <strong>PHP</strong> i <strong>MySQL</strong> poświęca swój czas na programową obsługę integralności danych znajdujących się w bazie. Jest oczywiście całkiem duże grono osób, które zupełnie nie zaprzątają sobie tym głowy. Śmietnik w bazie danych oczywiście nie zaszkodzi prostym małym projektom i może najwyżej zaszkodzić reputacji programisty tworzącemu tego typu serwisy. W przypadku rozbudowanych aplikacji w których baza danych składa się z dziesiątek tabel rozrastających się w trakcie życia projektu do rozmiarów liczonych w gigabajty, porządek jest już rzeczą niebagatelną i relatywnie wpływającą na szybkość działania witryny. Właśnie w takich przypadkach warto skorzystać z mechanizmów jakie oferują relacyjne bazy danych.</p>
<p><span id="more-15"></span></p>
<p>Kilka lat temu w <strong>MySQL</strong> domyślnym typem tabel był <strong>MyISAM</strong> i chociaż <strong>InnnoDB</strong> było wtedy już dostępne to jednak niewiele osób korzystało z tego rozwiązania. Szkoda, bo mimo pewnych wad, niewątpliwą zaletą <strong>InnoDB</strong> jest możliwość zrzucenia utrzymywania integralności danych na <strong>MySQL&#8217;a.</strong> Poświęcając odpowiednią ilość czasu na wykonanie prawidłowego projektu relacyjnej bazy danych opartej na tabelach typu <strong>InnoDB,</strong> nie będziemy tracić czasu na kodowanie odpowiednich metod utrzymujących integralność danych w bazie.</p>
<p>Jedną z podstawowych zalet mechanizmu składowania <strong>InnoDB,</strong> której nie posiada My<strong>I</strong>SAM to możliwość definiowania kluczy obcych w tabelach. W przypadku <strong>MyISAM</strong> klucze obce mogły być jedynie indeksowane, co oczywiście wpływało na na szybkość wykonywania zapytań jednak nie miało przełożenia na utrzymywanie integralności danych. Osobiście uważam, że w obecnej chwili poza wyjątkowymi sytuacjami praktycznie nie ma uzasadnienia by w swoich projektach wciąż kurczowo trzymać się <strong>MyISAM.</strong> Część osób w tym momencie powie, że <strong>InnoDB</strong> nie ma wyszukiwania pełno-tekstowego (<strong>Full-text search indexes</strong>) &#8230; <strong>no cóż od wersji 5.6.4 już ma</strong>, więc jeśli dysponujesz taką lub wyższą wersją MySQL, to wtedy pada ostatni bastion by nie używać <strong>InnoDB.</strong></p>
<p>Warto zauważyć, że w przypadku istniejących tabel, zmiana mechanizmu składowania nie wymaga ponownego tworzenia tabel. Zmianę można dokonać wykonując poniższe zapytanie:</p>
<p><code>ALTER TABLE `nazwa_tabeli` ENGINE = InnoDB</code></p>
<p>Metodę definiowania kluczy obcych opiszę na podstawie przykładów opartych na poniższym schemacie ERD prostej bazy danych:<img class="alignleft size-full wp-image-16" alt="Schemat tabel" src="http://mancando.pl/wp-content/uploads/2013/01/fk_pk.png" width="800" height="107" /></p>
<p>Baza składa się z dwóch tabel w których przechowywane są dane oraz jednej tabeli asocjacyjne, która je wiąże ze sobą. Po utworzeniu tabel i nadaniu odpowiednich indeksów na klucze można przejść do definiowania kluczy obcych.</p>
<p><code>ALTER TABLE `uzytkownik_typ` ADD FOREIGN KEY ( `id_uzytkownik` ) REFERENCES `uzytkownik` (`id_uzytkownik`) ON DELETE CASCADE ON UPDATE CASCADE ;</code></p>
<p><code>ALTER TABLE `uzytkownik_typ` ADD FOREIGN KEY ( `id_typ` ) REFERENCES `typ` (`id_typ`) ON DELETE CASCADE ON UPDATE CASCADE ;</code></p>
<p><strong>I już! Dzięki tym prostym zabiegom uzyskaliśmy pełną integralność danych w bazie, oraz kaskadowe usuwanie rekordów.</strong> Oznacza to, że każdorazowe usunięcie rekordu z tabeli `typ` lub też `uzytkownik` spowoduje usunięcie wszystkich wystąpień kasowanego klucza obcego w tabeli `uzytkownik_typ`. Przykład:</p>
<p><code>DELETE FROM `uzytkownik` WHERE `uzytkownik`.`id_uzytkownik` = 1</code></p>
<p>Wykonanie powyższego zapytania spowoduje usunięcie z tabeli `uzytkownicy` rekordu o identyfikatorze 1. Mechanizmy bazy danych, dążące do utrzymania integralności danych w tabelach wykonaja jednak również usunięcie wszystkich typów przypisanych do kasowanego użytkownika. Usnięte zostaną wszystkie rekordy z tabeli `uzytkownik_typ` w których wartość klucza obcego `id_uzytkownik` są równe 1.</p>
<p>Analogiczna sytuacja będzie występować w przypadku zmiany wartości klucza głównego w tabeli, `uzytkownik` lub `typ`. Każda z takich zmian będzie kaskadowo przenoszona na tabelę asocjacyjną `uzytkownik_typ`.</p>
<p>Jedna uwaga odnośnie modyfikacji istniejących tabel. Sama <strong>zmiana mechanizmów składowania na InnoDB nie wymaga zachowania integralności, jednak zdefiniowanie kluczy obcych wymaga doprowadzenia tabel do porządku</strong>. Sytuacja gdy tabela będzie  zwiera rekordy w których występują klucze obce, których nie ma w macierzystej, spowoduje zablokowanie możliwości ich zdefiniowania. W takich przypadkach przed definiowaniem kluczy obcych, dane w tabeli muszą być w pełni uporządkowane względem pozostałych tabel. Musisz samodzielnie przeprowadzić integrację tabel.</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL NULL == (decimal) 0.00</title>
		<link>http://www.mancando.pl/mysql-null-decimal-0-00/</link>
		<comments>http://www.mancando.pl/mysql-null-decimal-0-00/#comments</comments>
		<pubDate>Thu, 17 Jan 2013 18:26:42 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://mancando.pl/?p=8</guid>
		<description><![CDATA[Dziś MySQL zapewnił mi dość ciekawe doświadczenie. Spotkałem się z dziwną właściwością tej bazy danych. Jedna z tabel jaką wykorzystuję w pracy ma zdefiniowane pole WYNIK jako: decimal(3,2) a domyślna wartość tego pola to NULL. Tabela ta jest wykorzystywana jako &#8230; <a href="http://www.mancando.pl/mysql-null-decimal-0-00/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-50" style="clear: right; border: 0px none;" alt="komputerek_php" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_php.png" width="70" height="73" />Dziś MySQL zapewnił mi dość ciekawe doświadczenie. Spotkałem się z dziwną właściwością tej bazy danych. Jedna z tabel jaką wykorzystuję w pracy ma zdefiniowane pole WYNIK jako: <code>decimal(3,2)</code> a domyślna <img class="alignright size-full wp-image-51" style="border: 0px none; clear: right;" alt="komputerek_mysql" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_mysql.png" width="70" height="68" />wartość tego pola to NULL. Tabela ta jest wykorzystywana jako miejsc w którym trzymane są wyniki testów punktowanych lub zapisywany jest bieżący stan odpowiedzi.</p>
<p>W zależności od zawartości pola WYNIK test traktowany jest jako zapisany (wartość NULL) lub wysłany (wartość liczbowa decimal z uzyskanym wynikiem). W ostatnim czasie spotkałem się z dziwnym zachowaniem tego mechanizmu testów punktowanych. Korzystając z formularza otwartego w kilku oknach, można było nadpisać pierwotnie wysłane dane z odpowiedziami testu. Błąd ten wynikał z faktu, że mechanizm nie rozpoznawał w prawidłowy sposób statusu wysłanego testu. Było to o tyle dziwne, że patrząc od strony rekordów znajdujących się w bazie danych wyglądało to całkowicie prawidłowo.</p>
<p><span id="more-8"></span></p>
<p>Za brak prawidłowego rozpoznania odpowiedzialny był MySQL, dla którego wartość pola WYNIK = NULL jest równoważne z wartością pola WYNIK = 0.00.</p>
<p>W celu sprawdzenia statusu danego testu wykonywane było sprawdzenie liczby rekordów zwracanych przez poniższe zapytanie:<br />
<code>SELECT *FROM `test`<br />
WHERE `id_uzytkownika` =1<br />
AND `punkty` != NULL</code><br />
w obu przypadkach zwróci ten sam wynik, czyli <strong>0 rekordów</strong>.</p>
<p>Sposób na szybkie sprawdzenie rzeczywistego statusu testu to pobranie rekordu danego użytkownika a następnie <strong>sprawdzenie wartości pola już po stronie PHP</strong>. Można to zrealizować choćby w ten sposób:</p>
<p><code>$test_wyslany=0;<br />
if (!empty($test['WYNIK'])) {<br />
$test_wyslany=1;<br />
}</code></p>
<p>$test &#8211; tablica z wynikiem powyższego zapytania SQL</p>
<p>Ot taka ciekawostka ze styku programowania i właściwości baz danych.<br />
ddd</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/mysql-null-decimal-0-00/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
