<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Tag mysql</title>
    <link>http://blog.zabiello.com/articles/tag/mysql</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>PostgreSQL vs MySQL vs MSSQL2K</title>
      <description>&lt;p&gt;Zawsze dziwi&#322;em si&#281; dlaczego aplikacje komunikuj&#261;ce si&#281; z &lt;span class="caps"&gt;MSSQL&lt;/span&gt; chodz&#261; tak niemrawo. Zrobi&#322;em sobie szybki test szybko&#347;ci. Na tym samym komputerze zainstalowa&#322;em: &lt;span class="caps"&gt;MSSQL 2000 SP4&lt;/span&gt;, MySQL 5.0.27 i PostgreSQL 8.2.3. Zadanie by&#322;o proste, pobra&#263; list&#281; tabel w bazie.&lt;/p&gt;


	&lt;p&gt;U&#380;yto nast&#281;puj&#261;cego kodu w Pythonie:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;adodbapi&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;odbc&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;psycopg2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;time&lt;/span&gt;
&lt;span class="ident"&gt;conn&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;
  &lt;span class="punct"&gt;(&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysql&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;root&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;db&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;'),&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;SHOW TABLES&lt;/span&gt;&lt;span class="punct"&gt;'),&lt;/span&gt;
  &lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;pgsql&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;psycopg2&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;user='postgres' password='test''&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;),&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;SELECT * FROM pg_tables jdb273&lt;/span&gt;&lt;span class="punct"&gt;'),&lt;/span&gt;
  &lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;mssql ado&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;adodbapi&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Provider=SQLNCLI.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test&lt;/span&gt;&lt;span class="punct"&gt;'),&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;EXEC sp_tables&lt;/span&gt;&lt;span class="punct"&gt;'),&lt;/span&gt;
  &lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;mssql odbc&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;odbc&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;odbc&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;DRIVER={SQL Server};SERVER=localhost;DATABASE=test;UID=sa;PWD=test&lt;/span&gt;&lt;span class="punct"&gt;'),&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;EXEC sp_tables&lt;/span&gt;&lt;span class="punct"&gt;'),&lt;/span&gt;
  &lt;span class="punct"&gt;]&lt;/span&gt;
&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;repeat&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;100&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
  &lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;conn&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
    &lt;span class="ident"&gt;dbtype&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;db&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;sql&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;
    &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="ident"&gt;dbtype&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
    &lt;span class="ident"&gt;t&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;time&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
    &lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;i&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;range&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;repeat&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
      &lt;span class="ident"&gt;cursor&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;db&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;cursor&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
      &lt;span class="ident"&gt;cursor&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;rows&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;cursor&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;fetchall&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
      &lt;span class="ident"&gt;cursor&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;close&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
    &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;%d req/s&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="ident"&gt;round&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;repeat&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;time&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;__name__&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;__main__&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;
  &lt;span class="ident"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;U&#380;yta konfiguracja:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;WinXP Pro 2000 &lt;span class="caps"&gt;SP2&lt;/span&gt;, P4 3.2GHz, 1GB &lt;span class="caps"&gt;RAM&lt;/span&gt;.&lt;/li&gt;
		&lt;li&gt;Python 2.5&lt;/li&gt;
		&lt;li&gt;MySQL v5.0. 27, driver: MySQLdb v1.2.2&lt;/li&gt;
		&lt;li&gt;PostgreSQL v8.2.3, driver: psycopg2 v2.0.6b1 (dec dt ext pq3)&lt;/li&gt;
		&lt;li&gt;&lt;span class="caps"&gt;MSSQL 2000 SP4&lt;/span&gt;, driver: &lt;span class="caps"&gt;ADO&lt;/span&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Wyniki:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;:\&lt;/span&gt;&lt;span class="ident"&gt;home\app\bench\scripts&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ident"&gt;bench_db&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;py&lt;/span&gt;
&lt;span class="ident"&gt;mysql&lt;/span&gt; &lt;span class="number"&gt;457&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;pgsql&lt;/span&gt; &lt;span class="number"&gt;581&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;mssql&lt;/span&gt; &lt;span class="ident"&gt;ado&lt;/span&gt; &lt;span class="number"&gt;6&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;mssql&lt;/span&gt; &lt;span class="ident"&gt;odbc&lt;/span&gt; &lt;span class="number"&gt;9&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;

&lt;span class="constant"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;:\&lt;/span&gt;&lt;span class="ident"&gt;home\app\bench\scripts&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ident"&gt;bench_db&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;py&lt;/span&gt;
&lt;span class="ident"&gt;mysql&lt;/span&gt; &lt;span class="number"&gt;457&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;pgsql&lt;/span&gt; &lt;span class="number"&gt;581&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;mssql&lt;/span&gt; &lt;span class="ident"&gt;ado&lt;/span&gt; &lt;span class="number"&gt;9&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;mssql&lt;/span&gt; &lt;span class="ident"&gt;odbc&lt;/span&gt; &lt;span class="number"&gt;10&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;

&lt;span class="constant"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;:\&lt;/span&gt;&lt;span class="ident"&gt;home\app\bench\scripts&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ident"&gt;bench_db&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;py&lt;/span&gt;
&lt;span class="ident"&gt;mysql&lt;/span&gt; &lt;span class="number"&gt;457&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;pgsql&lt;/span&gt; &lt;span class="number"&gt;578&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;mssql&lt;/span&gt; &lt;span class="ident"&gt;ado&lt;/span&gt; &lt;span class="number"&gt;9&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;mssql&lt;/span&gt; &lt;span class="ident"&gt;odbc&lt;/span&gt; &lt;span class="number"&gt;11&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;

&lt;span class="constant"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;:\&lt;/span&gt;&lt;span class="ident"&gt;home\app\bench\scripts&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ident"&gt;bench_db&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;py&lt;/span&gt;
&lt;span class="ident"&gt;mysql&lt;/span&gt; &lt;span class="number"&gt;457&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;pgsql&lt;/span&gt; &lt;span class="number"&gt;581&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;mssql&lt;/span&gt; &lt;span class="ident"&gt;ado&lt;/span&gt; &lt;span class="number"&gt;8&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;mssql&lt;/span&gt; &lt;span class="ident"&gt;odbc&lt;/span&gt; &lt;span class="number"&gt;11&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;

&lt;span class="constant"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;:\&lt;/span&gt;&lt;span class="ident"&gt;home\app\bench\scripts&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ident"&gt;bench_db&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;py&lt;/span&gt;
&lt;span class="ident"&gt;mysql&lt;/span&gt; &lt;span class="number"&gt;455&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;pgsql&lt;/span&gt; &lt;span class="number"&gt;641&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;mssql&lt;/span&gt; &lt;span class="ident"&gt;ado&lt;/span&gt; &lt;span class="number"&gt;9&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;
&lt;span class="ident"&gt;mssql&lt;/span&gt; &lt;span class="ident"&gt;odbc&lt;/span&gt; &lt;span class="number"&gt;10&lt;/span&gt; &lt;span class="ident"&gt;req&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Mit o rzekomej szybko&#347;ci MySQL ju&#380; jest nieaktualny. Nowy PostgreSQL 8 bije go pod ka&#380;dym wzgl&#281;dem. Zar&#243;wno wydajno&#347;ciowo i jak i znacznie wi&#281;kszymi mozliwo&#347;ciami (o tym mo&#380;e kiedy indziej).  Dziwi s&#322;aba, a raczej n&#281;dzna, wydajno&#347;&#263; produktu firmy Microsoft. Nie sprawdza&#322;em nowego &lt;span class="caps"&gt;MSSQL 2005&lt;/span&gt;, ale wszystko wskazuje na to, &#380;e przynajmniej &lt;span class="caps"&gt;MSSQL2K&lt;/span&gt; to kompletne dno!&lt;/p&gt;</description>
      <pubDate>Mon, 02 Apr 2007 17:14:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:43ae7c94-8984-4c09-86f1-fa0bf007d58c</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/04/02/postgresql-vs-mysql-vs-mssql2k</link>
      <category>mysql</category>
      <category>postgresql</category>
      <category>mssql</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>MySQLdb i problem polskich znak&#243;w</title>
      <description>&lt;p&gt;W ko&#324;cu pojawi&#322;a si&#281; wersja stabilna pythonowej biblioteki &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=22307&amp;#38;package_id=15775"&gt;MySQLdb 1.2.2&lt;/a&gt;. Co ciekawsze, jest dost&#281;pna instalacja w formie pakieru &lt;a href="http://peak.telecommunity.com/DevCenter/PythonEggs"&gt;egg&lt;/a&gt; zar&#243;wno dla Pythona 2.4 jak i 2.5. Nie trzeba te&#380; ju&#380; wi&#281;cej u&#380;ywa&#263; instalator&#243;w binarnych pod windoz&#261;. Wystarczy (zak&#322;adaj&#261;c &#380;e mamy zainstalowane &lt;a href="http://peak.telecommunity.com/dist/ez_setup.py"&gt;setuptoolsy&lt;/a&gt;) wykona&#263; komend&#281;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;easy_install&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="constant"&gt;U&lt;/span&gt; &lt;span class="constant"&gt;MySQL_python&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Osoby u&#380;ywaj&#261;ce &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt; i MySQL5 musz&#261; pami&#281;ta&#263; aby doda&#263; dodatkow&#261; opcj&#281; do settings.py.&lt;/p&gt;


	&lt;p&gt;W wypadku wersji edge (z &lt;span class="caps"&gt;SVN&lt;/span&gt;), nale&#380;y doda&#263;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;DATABASE_OPTIONS&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;use_unicode&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;charset&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;utf8&lt;/span&gt;&lt;span class="punct"&gt;'}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W przypadku starszego kodu to nie pomaga&#322;o. Musia&#322;em wy&#322;&#261;czy&#263; zwracanie wynik&#243;w w postaci obiekt&#243;w unikodowych Pythona. W tym wypadku podzia&#322;a&#322;a opcja:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;DATABASE_OPTIONS&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{'&lt;/span&gt;&lt;span class="string"&gt;use_unicode&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="constant"&gt;False&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;charset&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;utf8&lt;/span&gt;&lt;span class="punct"&gt;'}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Widz&#281;, &#380;e Django najwyra&#378;niej idzie w tym samym kierunku co Pylons, tzn. my&#347;li aby wszystkie stringi i prac&#281; z baz&#261; oprze&#263; na obiektach unikodowych a nie stringach &lt;span class="caps"&gt;UTF&lt;/span&gt;-8. W wypadku &lt;a href="http://pylonshq.com"&gt;Pylons&#243;w&lt;/a&gt;, ich najnowszy system szablon&#243;w &lt;a href="http://makotemplates.org"&gt;Mako&lt;/a&gt; standardowo ju&#380; pracuje wewn&#281;trznie na czystych obiektach unikodowych Pythona.&lt;/p&gt;


	&lt;p&gt;Uwaga! Django ma troch&#281; niedopracowanego kodu. Np. panel admina si&#281; sypie jak ustawiona jest powy&#380;sza opcja z w&#322;&#261;czonym unikodem. Trzeba j&#261; &lt;strong&gt;wy&#322;&#261;czy&#263;&lt;/strong&gt;. Ale wtedy z kolei &#378;le si&#281; wy&#347;wietla cz&#281;&#347;&#263; tekst&#243;w zawieraj&#261;ca polskie znaki (np. imi&#281; czy nazwisko redaktora). Jednak lepsza to ni&#380; w og&#243;le brak mo&#380;liwo&#347;ci edycji rekord&#243;w. Wniosek: dla Django u&#380;ywaj drugiej opcji.  Aktualnie kod Django jeszcze nie dor&#243;s&#322; do tego, aby u&#380;ywa&#263; pe&#322;nego unikodu z baz&#261; MySQL.&lt;/p&gt;</description>
      <pubDate>Fri, 16 Mar 2007 02:36:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:29066297-2244-4a17-8e9b-e565744d5f6d</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/03/16/django-encoding</link>
      <category>mysql</category>
      <category>python</category>
      <category>django</category>
    </item>
    <item>
      <title>G&#322;upie zachowanie MySQL</title>
      <description>&lt;p&gt;Jak kto&#347; chce si&#281; po&#347;mia&#263; z MySQL, to &lt;a href="http://www.ex-parrot.com/~pete/mysql.html"&gt;niech zajrzy tutaj&lt;/a&gt;. Sprawdza&#322;em nawet na najnowszym stabilnym MySQL 5.0.27. Czasem mo&#380;na doda&#263; rekord o tym samym kluczu g&#322;&#243;wnym, a czasem nie mo&#380;na. Po prostu obciach.&lt;/p&gt;</description>
      <pubDate>Sun, 31 Dec 2006 05:16:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:58a33a37-f8bd-4ee4-87cc-47f0783c0ff3</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/12/31/stupid-mysql</link>
      <category>mysql</category>
    </item>
    <item>
      <title>MySQLdb &amp;amp; client encoding</title>
      <description>&lt;p&gt;[vide: &lt;a href="http://blog.zabiello.com/pages/en/mysqldb-client-encoding"&gt;English version&lt;/a&gt;]&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://sourceforge.net/projects/mysql-python"&gt;MySQLdb&lt;/a&gt; to g&#322;&#243;wna biblioteka dla Pythona obs&#322;uguj&#261;ca baz&#281; MySQL. Baza ta (od werseji 4.1 wzwy&#380;) ma wbudowany wygodny mechanizm translacji znak&#243;w jakie maj&#261; by&#263; wy&#347;wietlane dla klienta. Oczywi&#347;cie, nale&#380;y za&#322;o&#380;y&#263;, &#380;e natywnym formatem danych dla bazy to &lt;span class="caps"&gt;UTF&lt;/span&gt;-8. Za pomoc&#261; prostej kwerendy (SET &lt;span class="caps"&gt;NAMES&lt;/span&gt; latin2) mo&#380;na wymusi&#263; aby wszelkie napisy by&#322;y wypluwane do klienta w wybranym formacie (tu: iso-8859-2).&lt;/p&gt;


	&lt;p&gt;Ostatnio, przy okazji pracy z &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt;, przyjrza&#322;em si&#281; bardzo ciekawemu projektowi: &lt;a href="http://www.sqlalchemy.org/"&gt;SQLAlchemy&lt;/a&gt;. Wszystko wskazuje na to, &#380;e &lt;a href="http://www.sqlobject.org/"&gt;SQLObject&lt;/a&gt; odejdzie do lamusa (tym bardziej &#380;e jego tw&#243;rca co&#347; go porzuci&#322; i planuje stworzy&#263; nowy SQLObject2). &lt;a href="http://www.sqlalchemy.org/"&gt;SQLAlchemy&lt;/a&gt; jest nie tylko znacznie pote&#380;niejszym &lt;a href="http://en.wikipedia.org/wiki/Object-relationship_modeling"&gt;&lt;span class="caps"&gt;ORM&lt;/span&gt;&lt;/a&gt;, ale ma tak&#380;e znacznie lepsz&#261; dokumentacj&#281; ni&#380; SQLObject &amp;#8211; ok. 117 stron samego tylko &lt;a href="http://www.sqlalchemy.org/docs/"&gt;manuala&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Jedyny problem, jakie to typowe, to brak czytelnej opcji translacji polskich znak&#243;w. Podobny problem swego czasu znalaz&#322;em w Django (wys&#322;a&#322;em patcha i to poprawili dodaj&#261;c na sztywno &amp;#8220;SET &lt;span class="caps"&gt;NAMES&lt;/span&gt; utf8&amp;#8221;) W wypadku SQLAlchemy nie ma opcji do definicji kodowania po stronie klienta. Manual wspomina tylko o ustawieniu kodowania dla bazy, a to nie to samo. Okazuje, si&#281;, &#380;e rozwi&#261;zanie jest bardzo proste. Podczas tworzenia po&#322;&#261;czenia do bazy wystarczy u&#380;y&#263; dodatkowych parametr&#243;w. Nie ma potrzeby bawienia si&#281; w &#380;adne kwerendy &amp;#8220;SET &lt;span class="caps"&gt;NAMES&lt;/span&gt;&amp;#8221;. Owe parametry to &lt;strong&gt;use_unicode&lt;/strong&gt; i &lt;strong&gt;charset&lt;/strong&gt;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;
&lt;span class="ident"&gt;conn&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;
    &lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;root&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
    &lt;span class="ident"&gt;passwd&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
    &lt;span class="ident"&gt;db&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
    &lt;span class="ident"&gt;use_unicode&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;False&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; 
    &lt;span class="ident"&gt;charset&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;cp1250&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W powy&#380;szym wypadku, MySQL b&#281;dzie zak&#322;ada&#322; &#380;e klient ma odebra&#263; teksty w formacie string&#243;w cp1250. Za&#347; w wypadku u&#380;ycia &amp;#8220;use_unicode=True&amp;#8221; zwracane b&#281;d&#261; &#347;liczne obiekty unicodowe! Przyk&#322;adowy plik konfiguracyjny dla Pylonsa korzystaj&#261;cego z SQLAlchemy (config/&lt;i&gt;init&lt;/i&gt;.py) mo&#380;e zatem wygl&#261;da&#263; np. tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;from&lt;/span&gt; &lt;span class="ident"&gt;sqlalchemy&lt;/span&gt; &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;
&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;sqlalchemy&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;pool&lt;/span&gt; &lt;span class="ident"&gt;as&lt;/span&gt; &lt;span class="ident"&gt;pool&lt;/span&gt;
&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;getconn&lt;/span&gt;&lt;span class="punct"&gt;():&lt;/span&gt;
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;
        &lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;root&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
        &lt;span class="ident"&gt;passwd&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
        &lt;span class="ident"&gt;db&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
        &lt;span class="ident"&gt;use_unicode&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;False&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; 
        &lt;span class="ident"&gt;charset&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;utf8&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;

&lt;span class="ident"&gt;db&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;create_engine&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;
    &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysql://root:@localhost/test&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
    &lt;span class="ident"&gt;pool&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;pool&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;QueuePool&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;getconn&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;pool_size&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;max_overflow&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;40&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; 
    &lt;span class="ident"&gt;strategy&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;threadlocal&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="ident"&gt;metadata&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;BoundMetaData&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;db&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="ident"&gt;test_table&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Table&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;metadata&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;autoload&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Test(object):&lt;/span&gt;  
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;__str__&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;  
        &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;title&lt;/span&gt;  

&lt;span class="ident"&gt;test_mapper&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mapper&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;test_table&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W powy&#380;szym przyk&#322;adzie, wymusi&#322;em kodowanie utf8 dla klienta oraz po&#322;&#261;czenie z baz&#261; dzia&#322;a&#263; b&#281;dzie w puli 20-40 w&#261;tk&#243;w. W&#322;a&#347;nie tego mi brakuje w Django: pracy wielow&#261;tkowej, bo zu&#380;ywa ona mniej pami&#281;ci. W/w model mo&#380;na u&#380;y&#263; w kontrolerze Pylons (controllers/home.py) np. tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;from&lt;/span&gt; &lt;span class="ident"&gt;myproject&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;lib&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;base&lt;/span&gt; &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;
&lt;span class="ident"&gt;from&lt;/span&gt; &lt;span class="ident"&gt;myproject&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;models&lt;/span&gt; &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;HomeController(BaseController):&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;        
      &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rows&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;select&lt;/span&gt;&lt;span class="punct"&gt;([&lt;/span&gt;&lt;span class="ident"&gt;test_table&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;test_table&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]).&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
      &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;render_response&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;/home.myt&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 16 Aug 2006 01:28:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a7940b1d-4893-4e0a-b1aa-60d91a5a1207</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/08/16/mysqldb-client-encoding</link>
      <category>Databases</category>
      <category>Pylons</category>
      <category>Python</category>
      <category>mysql</category>
      <category>pylons</category>
      <category>python</category>
      <category>sqlalchemy</category>
    </item>
    <item>
      <title>MySQL 5 - strze&#380; si&#281; si&#281; tego koszmaru</title>
      <description>&lt;p&gt;Baza MySQL nigdy nie uchodzi&#322;a za wz&#243;r poprawnej pracy, ale to co ostatnio si&#281; z ni&#261; dzieje wo&#322;a o pomst&#281; do nieba&amp;#8230; Zainstalowa&#322;em sobie najnowsz&#261; wersj&#281; stabiln&#261; MySQL 5 pod win32. Wpierw mysla&#322;em &#380;e znalaz&#322;em jaki&#347; b&#322;&#261;d we frameworku &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt;. Ale kr&#243;tki czat z innymi programistami i &lt;a href="http://forums.mysql.com/read.php?103,84263,89870"&gt;przejrzenie netu&lt;/a&gt;, pozbawi&#322; mnie z&#322;udze&#324;. &lt;strong&gt;B&#322;&#261;d le&#380;y w silniku samej bazy&lt;/strong&gt;. W&#322;&#261;czy&#322;em logowanie zapyta&#324; i uruchomi&#322;em kwerend&#281; bezpo&#347;rednio z poziomu klienta.&lt;/p&gt;


	&lt;p&gt;Ot&#243;&#380; okazuje si&#281;, &#380;e w MySQL5 kompletnie popsuta jest obs&#322;uga warunku &amp;#8220;LIKE&amp;#8221;. Ilo&#347;&#263; zwracanych rekord&#243;w jest &lt;strong&gt;wi&#281;ksza ni&#380; by&#263; powinna&lt;/strong&gt;. I to nie chyba ma nic wsp&#243;lnego z tym, czy kodowanie tabel jest w &lt;span class="caps"&gt;UTF8&lt;/span&gt; czy nie, gdy&#380; nadmierna ilo&#347;&#263; rekord&#243;w jest znajdowana nawet, jak wyszukuje si&#281; s&#322;owo zawiera tylko znaki &lt;span class="caps"&gt;ASCII&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Inne &amp;#8220;kwiatki&amp;#8221; zwi&#261;zane z MySQL, o kt&#243;rych trzeba sobie jasno powiedzie&#263;, to notoryczne niszczenie plik&#243;w indeksowych w wypadku zbyt du&#380;ego obci&#261;&#380;enia bazy. Oczywi&#347;cie to mo&#380;na &#322;atwo naprawi&#263; za pomoc&#261; kwerendy &lt;span class="caps"&gt;REPAIR TABLE&lt;/span&gt; tabelka. Ale dop&#243;ki nie wykona si&#281; tej operacja, tabela &lt;strong&gt;nie jest dost&#281;pna&lt;/strong&gt; i aplikacja nam si&#281; wywali. Tego typu problemy zauwa&#380;y&#322;em  na MySQL 4.x i 4.1. Nie mia&#322;em okazji podda&#263; wi&#281;kszym obci&#261;&#380;eniom baz&#281; MySQL 5.x, ale nie zdziwi&#322;bym si&#281; jakby te&#380; z ni&#261; by&#322;y problemy.&lt;/p&gt;


	&lt;p&gt;Zawsze tyle si&#281; m&#243;wi w bran&#380;y, &#380;e MySQL to niepowa&#380;ny projekt amatorski (s&#322;aba stabilno&#347;&#263; i niszczenie swoich tabel pod du&#380;ym obci&#261;&#380;eniem, koszmarnie wolne tabele transakcyjne innodb, s&#322;aba obs&#322;uga lockowania &amp;#8211; tylko na poziomie tabel a nie wierszy itp, itd)   Niszczenie swoich tabel indeksowych mog&#322;em jeszcze zdzier&#380;y&#263;, ale b&#322;&#281;dna obs&#322;uga wyszukiwania tak podstawowej operacji jak &lt;span class="caps"&gt;LIKE&lt;/span&gt;? No way. Ca&#322;e szcz&#281;&#347;cie, &#380;e Django ma dobry &lt;span class="caps"&gt;ORM&lt;/span&gt; i mo&#380;na &#322;atwo zmigrowa&#263; do PostgreSQL. Chyba nie ma innego wyboru jak powiedzie&#263;: &amp;#8220;Goodbye MySQL and welcome PostgreSQL!&amp;#8221;&lt;/p&gt;</description>
      <pubDate>Mon, 29 May 2006 09:54:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:829ef093-eaa3-4878-a24f-9dd6a2cab70d</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/05/29/mysql-5-strze%C5%BC-si%C4%99-si%C4%99-tego-koszmaru</link>
      <category>Databases</category>
      <category>mysql</category>
    </item>
  </channel>
</rss>
