<?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>Cap Data Team SGBD Blog : Oracle, SQL Server, MySQL, Sybase... &#187; MySQL</title>
	<atom:link href="http://blog.capdata.fr/index.php/category/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.capdata.fr</link>
	<description>Le blog technique sur les bases de données de CAP DATA Consulting</description>
	<lastBuildDate>Wed, 01 Feb 2012 17:21:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Attention aux requêtes en double avec Windev et MySQL !</title>
		<link>http://blog.capdata.fr/index.php/attention-aux-requetes-en-double-avec-windev-et-mysql/</link>
		<comments>http://blog.capdata.fr/index.php/attention-aux-requetes-en-double-avec-windev-et-mysql/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 08:43:16 +0000</pubDate>
		<dc:creator>Cédric PEINTRE</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[HExécuteRequêteSQL]]></category>
		<category><![CDATA[HLitPremier]]></category>
		<category><![CDATA[hSansRafraichir]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[windev]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=1094</guid>
		<description><![CDATA[Hello,
Un post pour vous démontrer que c&#8217;est toujours intéressant de lire les documentations et que parfois, les petites lignes en bas de page peuvent révéler des informations importantes.
J&#8217;étais récemment chez un client pour un audit de performance dans un environnement Windev / MySQL.
Je ne suis pas un grand spécialiste de Windev, bien qu&#8217;ayant déjà réalisé [...]]]></description>
			<content:encoded><![CDATA[<p>Hello,</p>
<p>Un post pour vous démontrer que c&#8217;est toujours intéressant de lire les documentations et que parfois, les petites lignes en bas de page peuvent révéler des informations importantes.</p>
<p>J&#8217;étais récemment chez un client pour un audit de performance dans un environnement Windev / MySQL.<br />
Je ne suis pas un grand spécialiste de Windev, bien qu&#8217;ayant déjà réalisé des audits sur ce type d&#8217;environnement, je n&#8217;avais jamais eu l&#8217;occasion d&#8217;aller aussi loin dans la compréhension du code applicatif.</p>
<p>Au hasard de l&#8217;analyse des requêtes lentes (via le log des requêtes lentes), je me suis aperçu qu&#8217;une requête apparaissait systématiquement deux fois consécutivement dans le log.</p>
<p>Après avoir identifié avec mon client le bout de code exécutant cette requête, nous avons travaillé avec le log général de MySQL afin d&#8217;essayer de comprendre pourquoi cette requête était lancée deux fois alors qu&#8217;elle n&#8217;apparaissait qu&#8217;une fois dans le code applicatif.</p>
<p><span style="text-decoration: underline;">Le code utilisé est le suivant :</span></p>
<p><em>SD</em> est une Source de Données<br />
<em>MaReq</em> est une chaîne</p>
<pre>####################################################################################</pre>
<pre>MaReq = "SELECT nom, prenom FROM client WHERE type =  1"</pre>
<pre>// Exécution de la requête</pre>
<pre>HExécuteRequêteSQL(SD,  MaConnexionMySQL,  hRequêteSansCorrection,  MaReq)</pre>
<p><strong> </strong></p>
<pre>// Boucle sur le résultat</pre>
<pre>HLitPremier(SD)</pre>
<pre>TANTQUE  PAS HEnDehors(SD)</pre>
<pre>Trace(SD.Nom)</pre>
<pre>HLitSuivant(SD)</pre>
<pre>FIN</pre>
<pre>####################################################################################</pre>
<p>Le verdict du log général est sans appel, la requête est bien exécutée deux fois !</p>
<p>Petite parenthèse, la fonction <em><strong>HExécuteRequêteSQL</strong></em> réalise systématiquement une modification de code SQL (Ajout d&#8217;un ORDER BY par exemple). Si vous souhaitez conserver votre code SQL original, n&#8217;oubliez pas d&#8217;ajouter le paramètre <em><strong>hRequêteSansCorrection</strong></em> comme fait ici.</p>
<p>Mais revenons à nos moutons, la mystérieuse requête en double&#8230;<br />
Après plusieurs tests, nous avons réussi à identifier la cause de cette double exécution, il s&#8217;agissait de la fonction <em><strong>HLitPremier</strong></em>.</p>
<p>En effet, cette fonction exécute une nouvelle fois la requête, certainement pour intégrer d&#8217;éventuelles modifications de données entre le moment où l&#8217;on exécute la requête et le moment où l&#8217;on entre dans la boucle.<br />
Simplement, si la requête est déjà coûteuse, elle l&#8217;est d&#8217;autant plus si elle est lancée deux fois et la seconde exécution n&#8217;est pas forcement nécessaire.<br />
Cela dépend évidemment du contexte applicatif dans lequel vous vous trouvez. Dans le cas présent, ce n&#8217;était pas nécessaire.</p>
<p>Nous voici donc en train d&#8217;éplucher la documentation Windev (c&#8217;est là que vous comprenez mon introduction) à la recherche d&#8217;une information capitale dans notre cas : Comment désactiver cette double exécution ?</p>
<p>Et nous n&#8217;avons pas mis longtemps (enfin, un peu quand même&#8230;) à repérer de petites lignes en bas de la page de la documentation de l&#8217;accès natif MySQL pour Windev :</p>
<p><strong>Optimisations des fonctions HyperFileSQL (Réf :  <a href="http://doc.pcsoft.fr/fr-FR/?acces-natif-mysql-pour-windev-webdev" target="_blank">http://doc.pcsoft.fr/fr-FR/?acces-natif-mysql-pour-windev-webdev</a>)</strong></p>
<ul>
<li><strong>L</strong>es Tables fichiers basées sur des requêtes sont optimisées : il    est possible de trier la table en cliquant sur une de ses colonnes.</li>
<li><strong>Pour éviter de ré-exécuter plusieurs fois la même requête lors du parcours    de son résultat, il est conseillé d&#8217;utiliser la constante </strong><em><strong>hSansRafraichir </strong></em><strong>(par exemple si un seul poste modifie les    données).</strong></li>
</ul>
<p>Donc, pour résumer, si vous utilisez la fonction <em>HLitPremier</em> et que vous ne souhaitez pas que celle-ci ré-exécute la requête précédemment exécutée par la fonction <em>HExécuteRequêteSQL</em>, vous devez utiliser la fonction avec le paramètre suivant :</p>
<ul>
<li>HLitPremier(SD,  <strong>hSansRafraîchir</strong>)</li>
</ul>
<p>Et effectivement, le log général ne mentionnait plus qu&#8217;une seule exécution après cette correction de code Windev !</p>
<p>J&#8217;espère que cette information vous sera utile pour vos devs Windev existants ou à venir. N&#8217;hésitez pas à nous faire un retour si vous aviez déjà rencontré ce problème ou pour tout retour d&#8217;expérience Windev / MySQL.</p>
<p>Un grand merci à toute l&#8217;équipe qui se reconnaitra et à bientôt sur le blog de capdata.<br />
Cédric</p>
<p>Documentation sur le log des requêtes lentes : <a href="http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html" target="_blank">http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html<br />
</a>Documentation sur le log général :  <a href="http://dev.mysql.com/doc/refman/5.1/en/query-log.html" target="_blank">http://dev.mysql.com/doc/refman/5.1/en/query-log.html<br />
</a>Documentation Windev : <a href="http://doc.pcsoft.fr/fr-FR/" target="_blank">http://doc.pcsoft.fr/fr-FR/</a><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/formation-optimisation-de-requetes/" rel="bookmark" title="22 septembre 2010">Formation Optimisation de requêtes</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/abonnez-vous-au-blog-de-la-capdata-team/" rel="bookmark" title="23 juin 2010">Abonnez-vous au blog de la CapData team !</a> (Cédric PEINTRE) [GénéralMySQLOracleSQL ServerSybase]</li>
<li><a href="http://blog.capdata.fr/index.php/interet-de-creer-des-indexes-cluster-uniques/" rel="bookmark" title="16 mars 2010">Intérêt de créer des indexes cluster uniques</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/generer-le-ddl-complet-dune-base-en-csmo/" rel="bookmark" title="29 juillet 2010">Générer le DDL complet d&#8217;une base en C# / SMO / multithreading</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/que-faire-des-warning-aborted-connection-avec-mysql/" rel="bookmark" title="25 mars 2010">Que faire des &laquo;&nbsp;[Warning] Aborted connection&nbsp;&raquo; avec MySQL ?</a> (Cédric PEINTRE) [MySQL]</li>
</ul>
<p><!-- Similar Posts took 3.192 ms -->
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fattention-aux-requetes-en-double-avec-windev-et-mysql%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fattention-aux-requetes-en-double-avec-windev-et-mysql%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/attention-aux-requetes-en-double-avec-windev-et-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Abonnez-vous au blog de la CapData team !</title>
		<link>http://blog.capdata.fr/index.php/abonnez-vous-au-blog-de-la-capdata-team/</link>
		<comments>http://blog.capdata.fr/index.php/abonnez-vous-au-blog-de-la-capdata-team/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 11:48:49 +0000</pubDate>
		<dc:creator>Cédric PEINTRE</dc:creator>
				<category><![CDATA[Général]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Sybase]]></category>
		<category><![CDATA[capdata]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=1080</guid>
		<description><![CDATA[Bonjour à tous,
Juste un petit post pour vous rappeler les différentes méthodes vous permettant de suivre l&#8217;activité débordante du blog de la capdata team :

Accès standard via la page web : http://blog.capdata.fr
Vous abonner au flux RSS du blog et être ainsi prévenu de l&#8217;arrivée des nouveaux articles : http://feeds.feedburner.com/CapDataTeamBlog
Nous suivre sur Twitter pour retrouver l&#8217;actualité [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>
<p>Juste un petit post pour vous rappeler les différentes méthodes vous permettant de suivre l&#8217;activité débordante du blog de la capdata team :</p>
<ul>
<li>Accès standard via la page web : <a href="http://blog.capdata.fr" target="_blank">http://blog.capdata.fr</a></li>
<li>Vous abonner au flux RSS du blog et être ainsi prévenu de l&#8217;arrivée des nouveaux articles : <a href="http://feeds.feedburner.com/CapDataTeamBlog" target="_blank">http://feeds.feedburner.com/CapDataTeamBlog</a></li>
<li>Nous suivre sur Twitter pour retrouver l&#8217;actualité des bases de données : <a href="http://twitter.com/capdata_blog" target="_blank">http://twitter.com/capdata_blog</a></li>
</ul>
<p>Vous êtes de plus en plus nombreux à nous suivre sur ce blog technique autour des bases de données et nous vous en remercions.</p>
<p>J&#8217;en profite pour vous proposer quelques articles qui semblent avoir remportés un vif succès dernièrement :</p>
<ul>
<li><a href="http://blog.capdata.fr/index.php/jeux-de-caracteres-unicode-et-base-de-donnees/" target="_self">http://blog.capdata.fr/index.php/jeux-de-caracteres-unicode-et-base-de-donnees/</a></li>
<li><a href="http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/" target="_self">http://blog.capdata.fr/index.php/installation-oracle-11gr2-64-bits-sur-red-hat-5-partie-1/</a></li>
<li><a href="http://blog.capdata.fr/index.php/modifier-la-collation-dune-base-sql-2005/" target="_self">http://blog.capdata.fr/index.php/modifier-la-collation-dune-base-sql-2005/</a></li>
<li><a href="http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/" target="_self">http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/</a></li>
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/" target="_self">http://blog.capdata.fr/index.php/sybase-ase-direct-io-dsync-onoff-raw-device/</a></li>
</ul>
<p>Encore une fois, n&#8217;hésitez pas à poster vos commentaires sur les articles, l&#8217;échange est la richesse du contenu.</p>
<p>A bientôt sur le blog de la capdata team !<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/certification-sql-server-70-432-offerte/" rel="bookmark" title="25 février 2011">Voucher certification SQL Server 70-432 offert !</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/scruter-les-journaux-devenements-windows-avec-logparser/" rel="bookmark" title="12 mars 2010">Scruter les journaux d&#8217;évènements Windows avec LogParser</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/interet-de-creer-des-indexes-cluster-uniques/" rel="bookmark" title="16 mars 2010">Intérêt de créer des indexes cluster uniques</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/que-faire-des-warning-aborted-connection-avec-mysql/" rel="bookmark" title="25 mars 2010">Que faire des &laquo;&nbsp;[Warning] Aborted connection&nbsp;&raquo; avec MySQL ?</a> (Cédric PEINTRE) [MySQL]</li>
<li><a href="http://blog.capdata.fr/index.php/sybase-ase-planification-dans-adaptive-server/" rel="bookmark" title="19 juin 2009">Planification dans Adaptive Server</a> (David BAFFALEUF) [Sybase]</li>
</ul>
<p><!-- Similar Posts took 3.104 ms -->
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fabonnez-vous-au-blog-de-la-capdata-team%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fabonnez-vous-au-blog-de-la-capdata-team%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/abonnez-vous-au-blog-de-la-capdata-team/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jeux de caractères, Unicode  et Base de données</title>
		<link>http://blog.capdata.fr/index.php/jeux-de-caracteres-unicode-et-base-de-donnees/</link>
		<comments>http://blog.capdata.fr/index.php/jeux-de-caracteres-unicode-et-base-de-donnees/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 10:31:37 +0000</pubDate>
		<dc:creator>Guillaume DEFENDINI</dc:creator>
				<category><![CDATA[Général]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Sybase]]></category>
		<category><![CDATA[characterset]]></category>
		<category><![CDATA[jeux de caractères]]></category>
		<category><![CDATA[nchar]]></category>
		<category><![CDATA[nvarchar]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=961</guid>
		<description><![CDATA[Introduction
Un caractère est un symbole ou un signe unique appartenant à un alphabet.
Le jeu de caractères est un ensemble de caractères à représenter.
Il existe plusieurs jeux de caractères, permettant de représenter différents alphabets du monde.
Le standard ASCII
 
 
 
Afin de répertorier tous les caractères, un standard a été mis en place.
Le premier standard qui [...]]]></description>
			<content:encoded><![CDATA[<div><strong>Introduction</strong></div>
<div>Un caractère est un symbole ou un signe unique appartenant à un alphabet.</div>
<div>Le jeu de caractères est un ensemble de caractères à représenter.</div>
<div>Il existe plusieurs jeux de caractères, permettant de représenter différents alphabets du monde.</div>
<p><strong>Le standard ASCII</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><span style="font-weight: normal;">Afin de répertorier tous les caractères, un standard a été mis en place.</span></p>
<p><span style="font-weight: normal;">Le premier standard qui voit le jour est l’ASCII. </span></p>
<p><span style="font-weight: normal;">Pour représenter des caractères dans un fichier texte, on associe un nombre (code) à une lettre, à un chiffre ou à un symbole.</span></p>
<p><span style="font-weight: normal;">L’encodage le plus connu de l’ASCII est US-ASCII. </span></p>
<p><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">A =&gt; 65 =&gt; 01000001</span></p>
<p><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">a =&gt; 97 =&gt; 01100001 </span></p>
<p><span style="font-weight: normal;">Le codage est réalisé sur 7bits/octet soit 128 symboles possibles. Une trentaine d&#8217;entre eux sont des caractères de commande, le reste est constitué de l&#8217;alphabet anglais standard, des chiffres et des ponctuations. </span></p>
<p><span style="font-weight: normal;">L’extension la plus connue est la famille ISO-8859, permettant de représenter les caractères accentués. Le codage est réalisé sur un octet complet, soit 256 caractères possibles. Les codes de 160 à 255 sont affectés au codage des caractères latins accentués.</span></p>
<p><span style="font-weight: normal;">Standards ISO-8859-1 à 15</span></p>
<p><span style="font-weight: normal;"> ISO-8859-1 puis 15 (euro): Europe de l&#8217;Ouest</span></p>
<p><span style="font-weight: normal;"> ISO-8859-2: Europe Centrale ou de l&#8217;Est</span></p>
<p><span style="font-weight: normal;"> ISO-8859-5: Cyrillique</span></p>
<p><span style="font-weight: normal;"> ISO-8859-7: Grec</span><span><span style="font-weight: normal;"> </span></span></p>
<p><span style="font-weight: normal;"><strong> </strong></span></p>
<p><strong> <span style="font-weight: normal;">Les principaux problèmes rencontrés avec ce standard sont les suivants :</span></strong></p>
<p>- On ne peut utiliser plusieurs langues à l&#8217;intérieur d&#8217;une même instance.</p>
<p><span style="font-weight: normal;">- Deux grands absents de l&#8217;ISO-Latin-1 sont la ligature oe « œ », essentielle à la typographie française correcte, et le symbole de l&#8217;euro « € ».</span></p>
<p><span style="font-weight: normal;">- Chaque constructeur d&#8217;ordinateur a aussi développé ses propres codes non conformes aux standards internationaux (IBM EBCDIC, Windows-1252,..) </span></p>
<p><strong>L’unicode</strong></p>
<p><span style="font-weight: normal;">La globalisation consiste à intégrer dans une même table tous les caractères connus du monde. </span></p>
<p><span style="font-weight: normal;">Le standard Unicode est un mécanisme universel de codage de caractères. Il définit une manière cohérente de coder des textes multilingues et facilite l’échange de données textuelles. </span></p>
<p><span style="font-weight: normal;">Il est un passage obligatoire pour la plupart des nouveaux protocoles de l’Internet, mis en œuvre dans tous les systèmes d’exploitation et langages informatiques modernes.</span></p>
<p><span style="font-weight: normal;"><span style="text-decoration: underline;">Formes de codage</span></span></p>
<p><span style="font-weight: normal;">Il existe plusieurs formes de codage de caractères pour l&#8217;Universal Character Set:</span></p>
<p><span style="font-weight: normal;">- UCS-2</span></p>
<p><span style="font-weight: normal;">- UCS-4</span></p>
<p>Cependant, les codages UCS-2 et UCS-4 sont difficiles à utiliser dans de nombreuses applications et protocoles qui travaillent avec des caractères codés sur 8 ou même 7 bits. Même certains systèmes plus récents capables de travailler avec des caractères sur 16 bits ne peuvent pas traiter les données codées en UCS-4. Cette situation a conduit au développement de formats de transformation UTF (UCS Transformation Formats). Chacun possédant ses propres caractéristiques.</p>
<p><span style="text-decoration: underline;">Encodage UTF 8</span></p>
<p><span style="font-weight: normal;">UTF-8 a été conçu par Kenneth Thompson en 1992 pour être compatible avec certains logiciels originellement prévus pour traiter des caractères d&#8217;un seul octet. </span></p>
<p><span style="font-weight: normal;">Les caractères de numéro 0 à 127 sont codés sur un octet dont le bit de poids fort est toujours nul.</span></p>
<p><span style="font-weight: normal;">Les caractères de numéro supérieur à 127 sont codés sur plusieurs octets.</span></p>
<p><span style="text-decoration: underline;">Encodage UTF 16</span></p>
<p><span style="font-weight: normal;">UTF-16 est une méthode permettant de transformer un sous-ensemble de la table UCS-4 en une paire de valeurs UCS-2 d’une plage réservée. </span></p>
<p><span style="font-weight: normal;">UTF-16 est décomposé en 2 types.</span></p>
<p><span style="font-weight: normal;">UTF-16-BE (Big-endian)</span></p>
<p><span style="font-weight: normal;">UTF-16-LE (Little-endian)</span></p>
<p><span style="font-weight: normal;">Le codage UTF-16-BE est l&#8217;un des codages préconisés par la norme Unicode. Ce codage associe simplement un code de 16 bits (2 octets) à chaque caractère.</span></p>
<p><span style="text-decoration: underline;">Encodage UTF 32</span></p>
<p><span style="font-weight: normal;">UTF-32 est un protocole pour encoder les caractères sur 32 bits. Du fait que l’UTF-32 utilise 4 bytes par caractère. </span></p>
<p><span style="font-weight: normal;">Il est aussi  décomposé en 2 types.</span></p>
<p><span style="font-weight: normal;">UTF-32-BE (Big-endian)</span></p>
<p><span style="font-weight: normal;">UTF-32-LE (Little-endian)</span></p>
<p><span style="font-weight: normal;">Il est relativement consommateur d’espace.</span></p>
<p><strong>Support SGBD</strong></p>
<p style="text-align: center;"><a href="http://blog.capdata.fr/wp-content/uploads/2010/04/unicode_sgbd.png"><img class="size-medium wp-image-962 aligncenter" src="http://blog.capdata.fr/wp-content/uploads/2010/04/unicode_sgbd-300x161.png" alt="" width="500" height="261" /></a></p>
<p><strong>Oracle</strong></p>
<p><span style="font-weight: normal;">Deux paramètres permettent de prendre en charge l’Unicode.</span></p>
<ul>
<li><span style="font-weight: normal;">Database Character Set</span></li>
<li><span style="font-weight: normal;">National Character Set</span></li>
</ul>
<p><span style="font-weight: normal;">Ces paramètres sont définis lors de la création de la base.</span></p>
<p><span style="font-weight: normal;">L’instruction CREATE DATABASE dispose de la clause character set et de la clause national character set qui permettent de déclarer le jeu de caractères qui servira de jeu de caractères de la base et de jeu de caractères nationaux. </span></p>
<p><span style="font-weight: normal;">Sans spécification de la clause national character set, le jeu AL16UTF16 sera utilisé par défaut.</span></p>
<p><span style="font-weight: normal;">Le paramètre Database Character Set ne peut pas être configuré en UTF-16.</span></p>
<p><span style="font-weight: normal;">Oracle gère l&#8217;unicode au niveau des colonnes grâce </span>National Character Set et <span style="font-weight: normal;">au types de données suivantes :</span></p>
<ul>
<li><span style="font-weight: normal;">Nchar</span></li>
<li><span style="font-weight: normal;">Nvarchar2</span></li>
<li><span style="font-weight: normal;">nclob</span></li>
</ul>
<p><strong>Sybase</strong></p>
<p><span style="font-weight: normal;">Au moment de l’installation, vous devez définir le paramètre default character set. Par défaut il est déterminé par celui utilisé sur votre server (Win = 1252, solaris =ISO 8859-1). Sybase recommande de définir UTF 8 pour ce paramètre si vous utiliser de l&#8217;unicode.</span></p>
<p><span style="font-weight: normal;">Sybase supporte la gestion de l’unicode au niveau du type de colonne à l’aide des 3 types suivants : </span></p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Unichar</span></p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Univarchar</span></p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Unitext</span></p>
<p><span style="font-weight: normal;">Ces 3 types de données sont encodés en UTF 16.</span></p>
<p><strong>Sql server</strong></p>
<p><span style="font-weight: normal;">Nous  allons introduire la notion de collation.</span></p>
<p><span style="font-weight: normal;"> Une collation est une table de correspondance spécifique à un jeu de caractères. </span></p>
<p><span style="font-weight: normal;">Un jeu de caractères peut avoir plusieurs collations, en général une par langue (par exemple, latin1 français, latin1 suédois). </span></p>
<p><span style="font-weight: normal;">Ce paramètre se définit à l&#8217;installation, sa valeur par défaut est en fonction de la langue de l&#8217;OS sur lequel se fait l&#8217;installation (pour les collations de type windows) : </span></p>
<p><span style="font-weight: normal;">Système en français : French_CI_AS </span></p>
<p><span style="font-weight: normal;">Système en anglais : Latin1_General_CI_AS </span></p>
<p><span style="font-weight: normal;">Il sert à déterminer la page de code utilisée dans les champs non unicode (varchar par exemple), l&#8217;ordre de tri des chaînes de caractère et aussi la sensibilité aux accents, aux majuscules, etc.</span></p>
<p><span style="font-weight: normal;">La collation paramétrée s&#8217;applique aux bases de données systèmes (master, msdb, tempdb et model) et par défaut aux nouvelles bases de données créées. Elle peut cependant être modifiée lors de la création d&#8217;une nouvelle base de données ou lors de l&#8217;ajout d&#8217;un champ texte grâce au mot clef COLLATE. </span></p>
<p>Sql server supporte la gestion de l’unicode à travers le type de colonne :</p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Nchar</span></p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Nvarchar</span></p>
<p><span style="font-weight: normal;">-</span><span><span style="font-weight: normal;"> </span></span><span style="font-weight: normal;">Ntext</span></p>
<p><strong>My sql</strong></p>
<p>MySQL détermine le jeu de caractères et la collation en fonction de l&#8217;option de configuration active quand le serveur démarre ou en fonction des valeurs de configuration à l&#8217;exécution.</p>
<p><span style="font-weight: normal;">Vous pouvez utiliser &#8211;default-character-set=character_set_name comme jeu de caractères et vous pouvez en même temps ajouter &#8211;default-collation=collation_name pour la collation. Par défaut mysql utilise les options suivante &#8211;default-charset=latin1 &#8211;collation=latin1_swedish_ci car latin1_swedish_ci est la collation par défaut de latin1.</span></p>
<p><span style="font-weight: normal;">La collation peut aussi être définie au niveau de la base ou de la colonne à l’aide de la clause collate.</span></p>
<p><span style="font-weight: normal;">En MySQL version 4.x et plus ancien, NCHAR et CHAR étaient synonymes. </span></p>
<p><span style="font-weight: normal;">MySQL utilise UTF8 comme jeu de caractère prédéfini pour les champs de types Nchar et Nvarchar .</span><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/consistence-des-ecritures-avec-sata/" rel="bookmark" title="13 mars 2011">Consistence des écritures avec SATA</a> (David BAFFALEUF) [Operating SystemSQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/io-asynchrones-episode-1/" rel="bookmark" title="5 juillet 2011">I/O asynchrones (épisode 1)</a> (David BAFFALEUF) [Operating SystemSQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-2/" rel="bookmark" title="11 décembre 2008">Modes de récupération et journal de transactions, épisode 2</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/modes-de-recuperation-et-journal-de-transactions-episode-1/" rel="bookmark" title="13 juin 2008">Modes de récupération et journal de transactions, épisode 1</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/formation-optimisation-de-requetes/" rel="bookmark" title="22 septembre 2010">Formation Optimisation de requêtes</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.267 ms -->
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fjeux-de-caracteres-unicode-et-base-de-donnees%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fjeux-de-caracteres-unicode-et-base-de-donnees%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/jeux-de-caracteres-unicode-et-base-de-donnees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un trigger fait-il parti d&#8217;une transaction ?</title>
		<link>http://blog.capdata.fr/index.php/un-trigger-fait-il-parti-dune-transaction/</link>
		<comments>http://blog.capdata.fr/index.php/un-trigger-fait-il-parti-dune-transaction/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 13:31:54 +0000</pubDate>
		<dc:creator>Cédric PEINTRE</dc:creator>
				<category><![CDATA[Général]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Sybase]]></category>
		<category><![CDATA[ACID]]></category>
		<category><![CDATA[atomique]]></category>
		<category><![CDATA[transaction]]></category>
		<category><![CDATA[trigger]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=430</guid>
		<description><![CDATA[C&#8217;est une question que l&#8217;on peut se poser, même si la réponse parait évidente, nous ne sommes pas à l&#8217;abri d&#8217;éventuelles surprises. Verdict à la fin de ce post !
C&#8217;est d&#8217;ailleurs une question que l&#8217;on s&#8217;est posée, autour de la machine café, et qui du coup a fait l&#8217;objet d&#8217;un petit exercice avec Oracle, SQL [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est une question que l&#8217;on peut se poser, même si la réponse parait évidente, nous ne sommes pas à l&#8217;abri d&#8217;éventuelles surprises. Verdict à la fin de ce post !</p>
<p>C&#8217;est d&#8217;ailleurs une question que l&#8217;on s&#8217;est posée, autour de la machine café, et qui du coup a fait l&#8217;objet d&#8217;un petit exercice avec Oracle, SQL Server, MySQL et Sybase&#8230; Bon, je vous rassure, nous ne faisons pas que parler bases de données pendant les pauses café mais ça arrive, parfois.</p>
<h2>Place aux tests : Un trigger fait-il parti d&#8217;une transaction ?</h2>
<h3><span style="text-decoration: underline;">Test Oracle :</span></h3>
<pre>SQL &gt; create table t2 ( cnt int );
 SQL &gt; insert into t2 values ( 0 );
 SQL &gt; commit;
 SQL &gt; create table t ( x int check ( x&gt;0 ) );</pre>
<pre>SQL &gt; create trigger t_trigger
 before insert or delete on t for each row
 begin
 if ( inserting ) then
 update t2 set cnt = cnt +1;
 else
 update t2 set cnt = cnt -1;
 end if;
 dbms_output.put_line( 'I fired and updated ' ||sql%rowcount || ' rows'  );
 end;
 /</pre>
<p><span style="text-decoration: underline;">Résultat : OUI<br />
</span></p>
<pre>SQL &gt; set serveroutput on
 SQL &gt; insert into t values (1);
 I fired and updated 1 rows
 1 row created.
 SQL &gt; insert into t values(-1);
 I fired and updated 1 rows
 insert into t values(-1)
 *
 ERROR at line 1:
 ORA-02290: check constraint (SYS_C009597) violated
 SQL &gt; select * from t2;
 CNT
 ----------
 1</pre>
<h3><span style="text-decoration: underline;">Test MS SQL Server :</span></h3>
<pre>use tempdb
 go</pre>
<pre>create table t2 ( cnt int )
 insert into  t2 values ( 0 )
 select * from t2</pre>
<pre>create table t ( x int check  ( x&gt;0 ) )</pre>
<pre>drop trigger t_trigger
 create trigger t_trigger  on t for insert
 as
 begin
 update t2 set cnt = cnt +1
 print( 'I fired and updated ' + CAST(@@ROWCOUNT AS NVARCHAR(8))  + '  rows' )
 end</pre>
<p><span style="text-decoration: underline;">Résultat : OUI<br />
</span></p>
<pre>begin tran
 insert into t values(2);
 insert into t values(-1);</pre>
<pre>(1 row(s) affected)
 I fired and updated  1 rows</pre>
<pre>(1 row(s) affected)
 Msg 547, Level 16, State  0, Line 4
 The INSERT statement conflicted with the CHECK constraint  "CK__t__x__7A5DD7C8". The conflict occurred in database "tempdb", table  "dbo.t", column 'x'.
 The statement has been terminated.</pre>
<h3><span style="text-decoration: underline;">Test MySQL (InnoDB) :</span></h3>
<p>Au passage, cela m&#8217;a permis de découvrir que les contraintes <em>CHECK </em>n&#8217;étaient  pas prises en charge par MySQL : <em>The <code>CHECK</code> clause is  parsed but ignored by all storage engines</em></p>
<pre>mysql&gt; set autocommit=off;
 Query OK, 0 rows affected (0.02  sec)</pre>
<pre>mysql&gt; use test
 Database changed
 mysql&gt; create  table t2 ( cnt int ) engine=innodb;
 Query OK, 0 rows affected (0.11  sec)</pre>
<pre>mysql&gt; insert into t2 values ( 0 );
 Query OK, 1 row  affected (0.02 sec)</pre>
<pre>mysql&gt; commit;
 Query OK, 0 rows  affected (0.11 sec)</pre>
<pre>mysql&gt; create table t ( x int primary key)  engine=innodb;
 Query OK, 0 rows affected (0.09 sec)</pre>
<pre>mysql&gt;  delimiter //</pre>
<pre>mysql&gt; create trigger t_trigger
 -&gt;             before insert on t for each row
 -&gt;              begin
 -&gt;             update t2 set cnt = cnt +1;
 -&gt;             end;
 -&gt; //
 Query OK, 0 rows affected (0.11  sec)</pre>
<pre>mysql&gt; delimiter ;</pre>
<p><span style="text-decoration: underline;">Résultat : OUI<br />
</span></p>
<pre>mysql&gt; insert into t values (1);
 Query OK, 1 row affected  (0.02 sec)</pre>
<pre>mysql&gt; insert into t values (1);
 ERROR 1062  (23000): Duplicate entry '1' for key 'PRIMARY'</pre>
<pre>mysql&gt; select *  from t2;
 +------+
 | cnt  |
 +------+
 |    1 |
 +------+
 1 row in set (0.00 sec)</pre>
<h3><span style="text-decoration: underline;">Test Sybase :<br />
</span></h3>
<pre>1&gt; create trigger T1_ins_tr on T1 for insert</pre>
<pre>2&gt; as</pre>
<pre> 3&gt; begin</pre>
<pre> 4&gt; select 1/0</pre>
<pre> 5&gt; end</pre>
<pre> 6&gt; go</pre>
<p><span style="text-decoration: underline;">Résultat : OUI<br />
</span></p>
<pre>5&gt; begin tran
 6&gt; go
 1&gt; insert into T1 values ('kjhkjhkjh')
 2&gt; go
 Msg 3607, Level 16, State 0:
 Server 'ASE1502', Procedure 'T1_ins_tr', Line 4:
 Divide by zero occurred.</pre>
<pre>-----------
 1&gt; select @@trancount
 2&gt; go</pre>
<pre>-----------
 0</pre>
<pre>(1 row affected)</pre>
<h2>Résultat des tests : LE VERDICT !</h2>
<p>Oui, un trigger fait bien parti d&#8217;une transaction, quel que soit le SGBD, enfin, au moins sur Oracle, SQL Serveur, MySQL et Sybase.</p>
<p>Je vous laisse faire vos tests sur DB2, Postgre et consorts&#8230; N&#8217;hésitez pas à nous faire un retour dans les commentaires.</p>
<p>A+<br />
Cédric<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/mythe-sql-server-associe-un-thread-a-chaque-connexion/" rel="bookmark" title="1 août 2010">Mythe: SQL Server associe un thread à chaque connexion</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/fragmentation-sur-des-tables-stockees-en-s-gam/" rel="bookmark" title="20 août 2010">Fragmentation sur des tables stockées en S-GAM</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/saines-lectures/" rel="bookmark" title="25 août 2010">Saines lectures</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/scripting-et-smo-suite-scripter-les-objets-directement-en-t-sql/" rel="bookmark" title="3 août 2010">Scripting et SMO (suite): scripter les objets directement en T-SQL</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/sql-server-regles-dinstallation-de-base-episode-1/" rel="bookmark" title="18 juin 2009">Règles d&#8217;installation de base (épisode 1)</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.212 ms -->
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fun-trigger-fait-il-parti-dune-transaction%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fun-trigger-fait-il-parti-dune-transaction%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/un-trigger-fait-il-parti-dune-transaction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Que faire des &#171;&#160;[Warning] Aborted connection&#160;&#187; avec MySQL ?</title>
		<link>http://blog.capdata.fr/index.php/que-faire-des-warning-aborted-connection-avec-mysql/</link>
		<comments>http://blog.capdata.fr/index.php/que-faire-des-warning-aborted-connection-avec-mysql/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 16:44:58 +0000</pubDate>
		<dc:creator>Cédric PEINTRE</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Aborted connection]]></category>
		<category><![CDATA[Got an error reading communication packets]]></category>
		<category><![CDATA[log-warnings]]></category>
		<category><![CDATA[[Warning] Aborted connection]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=495</guid>
		<description><![CDATA[Un petit post sur cet avertissement que l&#8217;on rencontre bien souvent chez nos clients MySQL.
Ceux qui utilisent MySQL ont sans doute déjà croisé ce type de warning et découverts que les informations fournies par MySQL sur le sujet sont limitées (ainsi que les infos que l&#8217;on peut glaner sur le net)
Je veux parler ici d&#8217;erreurs [...]]]></description>
			<content:encoded><![CDATA[<p>Un petit post sur cet avertissement que l&#8217;on rencontre bien souvent chez nos clients MySQL.<br />
Ceux qui utilisent MySQL ont sans doute déjà croisé ce type de <em>warning </em>et découverts que les informations fournies par MySQL sur le sujet sont limitées (ainsi que les infos que l&#8217;on peut glaner sur le net)</p>
<p>Je veux parler ici d&#8217;erreurs récurrentes, qui se produisent de façon aléatoire plusieurs fois par jour, pas d&#8217;une erreur liée à un mauvais mot de passe ou à des privilèges insuffisants qui peuvent également générer ce type d&#8217;erreur.</p>
<h3>Ce qu&#8217;en dit MySQL :</h3>
<p>La page de documentation concernant ce problème est la suivante :</p>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/communication-errors.html" target="_blank">http://dev.mysql.com/doc/refman/5.1/en/communication-errors.html</a></li>
</ul>
<p>En fait, il y a deux raisons essentielles pour lesquelles MySQL est susceptible de renvoyer cette erreur : Des problèmes liés au réseau ou des problèmes liés au mode de sortie de session dans le code applicatif.<br />
Pour ce dernier cas, attention à bien utiliser la fonction <a title="21.9.3.5. mysql_close()" href="http://dev.mysql.com/doc/refman/5.1/en/mysql-close.html" target="_blank"><code>mysql_close()</code></a> dans votre code applicatif.</p>
<h3>Dans la pratique, que faire de cet avertissement ?</h3>
<p>La première question à se poser est de savoir si ce problème affecte, d&#8217;une façon ou d&#8217;une autre, votre production.<br />
Pour le savoir, plusieurs sources sont à votre disposition : Les utilisateurs qui peuvent vous remonter des erreurs, les logs applicatifs ou vos outils de monitoring qui clignotent trop régulièrement&#8230;</p>
<p>Si l&#8217;impact de cette erreur sur votre production est nulle, je vous recommande simplement de désactiver la remontée d&#8217;info la concernant via le paramètre <a href="http://dev.mysql.com/doc/refman/5.1/en/server-options.html#option_mysqld_log-warnings" target="_blank">log-warnings</a> :</p>
<ul>
<li>set global log_warnings = 1;</li>
</ul>
<p>Attention toutefois, la manipulation de ce paramètre peut entraîner la désactivation complète de tous les <em>warnings</em>. Rapprochez vous de la documentation de ce paramètre pour plus d&#8217;infos :</p>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/server-options.html#option_mysqld_log-warnings" target="_blank">http://dev.mysql.com/doc/refman/5.1/en/server-options.html#option_mysqld_log-warnings</a></li>
</ul>
<p><span style="text-decoration: underline;">Sinon, je vous invite à suivre le mode opératoire suivant :</span></p>
<ul>
<li>Demander aux admins réseau de vérifier les différents composants réseau de votre architecture afin d&#8217;identifier d&#8217;éventuels problèmes</li>
<li>Vérifier votre code applicatif et la bonne utilisation de la fonction <a title="21.9.3.5. mysql_close()" href="http://dev.mysql.com/doc/refman/5.1/en/mysql-close.html" target="_blank"><code>mysql_close()</code></a></li>
<li>Vérifier que vos clients MySQL ne dépassent pas le <em>timeout </em>de connexion défini par la variable <a href="http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_connect_timeout" target="_blank"><code>connect_timeout</code></a></li>
<li>Augmenter la valeur du paramètre <a href="http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_max_allowed_packet" target="_blank"><code>max_allowed_packet</code></a> (cette dernière méthode semble d&#8217;ailleurs porter ses fruits chez un grand nombre d&#8217;utilisateurs)</li>
</ul>
<p>Si ces différentes opérations ne permettent pas d&#8217;identifier ou de régler votre problème, essayez d&#8217;appliquer chaque point préconisé dans la documentation mentionnée en début d&#8217;article et croisez les doigts !</p>
<p>N&#8217;hésitez pas à me faire un retour d&#8217;expérience sur ce point à travers les commentaires. Merci.</p>
<p>Bonne fin de semaine<br />
Cédric.<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/scruter-les-journaux-devenements-windows-avec-logparser/" rel="bookmark" title="12 mars 2010">Scruter les journaux d&#8217;évènements Windows avec LogParser</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/" rel="bookmark" title="6 janvier 2010">MySQL et les tables temporaires internes</a> (Cédric PEINTRE) [MySQL]</li>
<li><a href="http://blog.capdata.fr/index.php/insert-et-update-en-une-seule-fois-cest-possible-merge/" rel="bookmark" title="26 mars 2010">Insert et Update en une seule fois avec MERGE</a> (Guillaume DEFENDINI) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/abonnez-vous-au-blog-de-la-capdata-team/" rel="bookmark" title="23 juin 2010">Abonnez-vous au blog de la CapData team !</a> (Cédric PEINTRE) [GénéralMySQLOracleSQL ServerSybase]</li>
<li><a href="http://blog.capdata.fr/index.php/interet-de-creer-des-indexes-cluster-uniques/" rel="bookmark" title="16 mars 2010">Intérêt de créer des indexes cluster uniques</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.254 ms -->
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fque-faire-des-warning-aborted-connection-avec-mysql%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fque-faire-des-warning-aborted-connection-avec-mysql%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/que-faire-des-warning-aborted-connection-avec-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XtraDB sauvegarde votre cache, et ça marche !</title>
		<link>http://blog.capdata.fr/index.php/xtradb-sauvegarde-votre-cache-et-ca-marche/</link>
		<comments>http://blog.capdata.fr/index.php/xtradb-sauvegarde-votre-cache-et-ca-marche/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 08:00:30 +0000</pubDate>
		<dc:creator>Cédric PEINTRE</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[innodb buffer pool]]></category>
		<category><![CDATA[innodb_buffer_pool_size]]></category>
		<category><![CDATA[percona]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[xtradb]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=643</guid>
		<description><![CDATA[La dernière version de XtraDB, le moteur de stockage proposé par Percona, dispose d&#8217;une fonctionnalité plutôt pertinente avec MySQL : La sauvegarde du cache InnoDB (InnoDB Buffer Pool)
Sauvegarder le cache, oui, mais pour quoi faire ?
Vous devez effectivement comprendre l&#8217;intérêt de la chose si vous vous êtes déjà frotté à l&#8217;administration d&#8217;un MySQL mais je [...]]]></description>
			<content:encoded><![CDATA[<p>La dernière version de XtraDB, le moteur de stockage proposé par Percona, dispose d&#8217;une fonctionnalité plutôt pertinente avec MySQL : La sauvegarde du cache InnoDB (InnoDB Buffer Pool)</p>
<h3>Sauvegarder le cache, oui, mais pour quoi faire ?</h3>
<p>Vous devez effectivement comprendre l&#8217;intérêt de la chose si vous vous êtes déjà frotté à l&#8217;administration d&#8217;un MySQL mais je dois vous avouer qu&#8217;en abordant le sujet pendant la pose café, tout le monde n&#8217;était pas forcement convaincu.</p>
<p>En effet, la mise en œuvre d&#8217;une telle fonctionnalité soulève une autre question : Pourquoi redémarrer MySQL ?</p>
<p>Effectivement, le véritable intérêt de cette sauvegarde est de pouvoir couper son MySQL sans perdre les informations stockées dans le cache. Intérêt évidemment compris de tous dans le cas d&#8217;un crash du serveur MySQL.</p>
<p>Dans les faits, XtraDB permet de sauvegarder et restaurer le cache même si il n&#8217;y a pas eu d&#8217;arrêt de l&#8217;instance. Ce qui peut d&#8217;ailleurs s&#8217;avérer utile dans certaines conditions, après le passage d&#8217;un gros batch par exemple, afin de retrouver un cache d&#8217;activité transactionnelle standard.</p>
<p>Pour en revenir à la question posée par mon collègue, en dehors du contexte de crash, pourquoi redémarrer MySQL ?<br />
Alors que d&#8217;autres éditeurs de bases de données concentrent leurs efforts pour justement limiter au maximum le redémarrage des instances, il semble que MySQL soit plus exposé que les autres à ce type de problématique.<br />
Et effectivement, même si la modification dynamique de paramètres gagne du terrain avec les nouvelles versions, la gestion des fichiers physiques reste problématique dans un environnement de production critique.</p>
<p>Il s&#8217;agit donc ici de se poser la question à l&#8217;envers et c&#8217;est donc pour ces différentes raisons que la sauvegarde du cache de données est pertinente avec MySQL !</p>
<h3>Comment ça marche ?</h3>
<p>Le pré-requis est évidemment d&#8217;installer et d&#8217;utiliser le moteur de stockage XtraDB fourni par Percona (lien en fin d&#8217;article).</p>
<p>Pour comprendre le fonctionnement de cette sauvegarde, j&#8217;ai réalisé un petit test en utilisant le compteur <em>Innodb_buffer_pool_pages_data</em> qui indique combien de pages du cache sont utilisées :</p>
<p>1 &#8211; Arrêt et relance de l&#8217;instance MySQL (Tous les caches sont vidés)</p>
<p>2 &#8211; Je contrôle l&#8217;état de mon cache :</p>
<ul>
<li>mysql&gt; show global status like &#8216;Innodb_buffer_pool_pages_data&#8217;;</li>
</ul>
<pre>+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_buffer_pool_pages_data | 14    |
+-------------------------------+-------+
</pre>
<p>3 &#8211; Je fais une requête simple sur ma table ETAT :</p>
<ul>
<li>mysql&gt; select * from capdata_innodb.ETAT;</li>
</ul>
<p>4 -Nouvelle vérification du cache, à ce stade, la table ETAT a bien été montée dans le cache (au moins une  partie de ses données) :</p>
<ul>
<li>mysql&gt; show global status like &#8216;Innodb_buffer_pool_pages_data&#8217;;</li>
</ul>
<pre>+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_buffer_pool_pages_data | 17    |
+-------------------------------+-------+
</pre>
<p>5 &#8211; Je lance une sauvegarde du cache :</p>
<ul>
<li>mysql&gt; select * from information_schema.XTRADB_ADMIN_COMMAND /*!XTRA_LRU_DUMP*/;</li>
</ul>
<pre>+------------------------------+
| result_message               |
+------------------------------+
| XTRA_LRU_DUMP was succeeded. |
+------------------------------+
</pre>
<p>6 &#8211; Arrêt et relance de l&#8217;instance MySQL (Tous les caches sont vidés)</p>
<p>7 &#8211; Vérification du cache :</p>
<ul>
<li>mysql&gt; show global status like &#8216;Innodb_buffer_pool_pages_data&#8217;;</li>
</ul>
<pre>+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_buffer_pool_pages_data | 14    |
+-------------------------------+-------+</pre>
<p>8 -Restauration du cache :</p>
<ul>
<li>mysql&gt; select * from information_schema.XTRADB_ADMIN_COMMAND /*!XTRA_LRU_RESTORE*/;</li>
</ul>
<pre>+---------------------------------+
| result_message                  |
+---------------------------------+
| XTRA_LRU_RESTORE was succeeded. |
+---------------------------------+
</pre>
<p>9 &#8211; Dernière vérification du cache :</p>
<ul>
<li>mysql&gt; show global status like &#8216;Innodb_buffer_pool_pages_data&#8217;;</li>
</ul>
<pre>+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_buffer_pool_pages_data | 17    |
+-------------------------------+-------+
</pre>
<p>Le cache a bien été restauré, à vous le warm restart facile !</p>
<p>Percona a réalisé un petit benchmark comparatif dont voici le résultat :</p>
<p><a href="http://blog.capdata.fr/wp-content/uploads/2010/03/test_xtraDB_CB.png"><img class="aligncenter size-full wp-image-706" title="test_xtraDB_CB" src="http://blog.capdata.fr/wp-content/uploads/2010/03/test_xtraDB_CB.png" alt="" width="796" height="282" /></a></p>
<p>Retrouvez toutes les informations sur le moteur XtraDB ici : <a href="http://www.percona.com/docs/wiki/percona-xtradb:start" target="_blank">http://www.percona.com/docs/wiki/percona-xtradb:start</a><strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/error-8976-8978-problemes-de-chainage-comment-recuperer-les-donnees/" rel="bookmark" title="30 mai 2011">Error 8976 / 8978, problèmes de chaînage, comment récupérer les données</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/point-in-time-recovery-et-fn_dump_dblog/" rel="bookmark" title="13 juillet 2011">Point-in-time recovery et fn_dump_dblog()</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/bench-avec-netapp-datacore-esx/" rel="bookmark" title="26 avril 2011">Bench avec NetApp / Datacore / ESX</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/pourquoi-il-faut-sauvegarder-les-bases-systemes/" rel="bookmark" title="3 juillet 2011">Pourquoi il faut sauvegarder les bases systèmes</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/sql-server-principes-dune-sauvegarde-a-chaud/" rel="bookmark" title="12 décembre 2008">Principes d&#8217;une sauvegarde à chaud</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.937 ms -->
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fxtradb-sauvegarde-votre-cache-et-ca-marche%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fxtradb-sauvegarde-votre-cache-et-ca-marche%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/xtradb-sauvegarde-votre-cache-et-ca-marche/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MySQL et les tables temporaires internes</title>
		<link>http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/</link>
		<comments>http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 16:04:34 +0000</pubDate>
		<dc:creator>Cédric PEINTRE</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[max_heap_table_size]]></category>
		<category><![CDATA[tables temporaires]]></category>
		<category><![CDATA[temporary tables]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[tmp_table_size]]></category>

		<guid isPermaLink="false">http://blog.capdata.fr/?p=293</guid>
		<description><![CDATA[MySQL créé des tables temporaires automatiquement lors de certaines sélections de données, en particulier lors de l&#8217;utilisation des clauses ORDER BY ou GROUP BY.
Le détail des cas de création de tables temporaires est disponible dans la documentation MySQL :

http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html

Ces tables temporaires sont créées en mémoire par défaut, dans la limite de la taille définie par [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL créé des tables temporaires automatiquement lors de certaines sélections de données, en particulier lors de l&#8217;utilisation des clauses <em>ORDER BY</em> ou<em> GROUP BY</em>.</p>
<p>Le détail des cas de création de tables temporaires est disponible dans la documentation MySQL :</p>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html" target="_blank">http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html</a></li>
</ul>
<p>Ces tables temporaires sont créées en mémoire par défaut, dans la limite de la taille définie par le paramètre <strong><em>tmp_table_size</em> </strong>[taille par défaut dépendante de l'OS]. Au delà de cette limite, la table temporaire est créée sur disque. Attention toutefois, si la valeur du paramètre <em>max_heap_table_size</em> [16M par défaut] est inférieure à celle de <em>tmp_table_size</em>, alors les tables temporaires en mémoire seront limitées à <em>max_heap_table_size</em>. Pour simplifier les choses, positionnez les deux paramètres à la même valeur.</p>
<p>Il est évidemment plus performant de provoquer le maximum de création en mémoire en positionnant la valeur du paramètre<em> tmp_table_size</em> à une taille relativement importante (16M à 32M).<br />
Attention toutefois au débordement mémoire, en effet, cette taille peut potentiellement être consommée par chaque thread connecté !</p>
<p>La colonne <em>Extra </em>de la commande <em>EXPLAIN </em>pour une requête de type <em>SELECT </em>permet d&#8217;obtenir une information sur la création d&#8217;une éventuelle table temporaire.<br />
Dans ce cas (utilisation d&#8217;un<em> GROUP BY</em>), une table temporaire sera créée :</p>
<p style="text-align: center;">*************************** 1. row ***************************<br />
id: 1<br />
select_type: SIMPLE<br />
table: t_evenement<br />
type: ALL<br />
possible_keys: NULL<br />
key: NULL<br />
key_len: NULL<br />
ref: NULL<br />
rows: 14988<br />
Extra: <strong>Using temporary</strong>; Using filesort</p>
<p>En revanche, cette commande ne permet pas de savoir si la table temporaire est créée sur disque ou en mémoire, pour cela, il faudra s&#8217;appuyer sur les compteurs MySQL évoqués dans la suite de l&#8217;article.</p>
<p>Le graphe suivant présente un état des tables temporaires créées en mémoire et sur disque pour notre instance de production  :</p>
<div id="attachment_378" class="wp-caption aligncenter" style="width: 549px"><a href="http://www.capdata.fr/support-DBA-oracle-sqlserver-mysql-sybase.htm"><img class="size-full wp-image-378  " src="http://blog.capdata.fr/wp-content/uploads/2010/01/temporay_tables.jpg" alt="Tables temporaires" width="539" height="376" /></a><p class="wp-caption-text">Tables temporaires MySQL</p></div>
<p>Les compteurs MySQL utilisés pour relever ces valeurs sont<code> <em>Created_tmp_table</em> et <em>Created_tmp_disk_tables</em>.</code> Il n&#8217;est malheureusement pas possible de connaitre la taille consommée en mémoire ou sur disque par ces tables temporaires.</p>
<p>Ici, la quasi totalité des tables temporaires est créée sur disque. La taille maximum d&#8217;une table temporaire en mémoire est pourtant positionnée à une valeur relativement importante (48M).</p>
<p><strong>Le fait d&#8217;augmenter la valeur du <em>tmp_table_size</em> ne changera rien dans ce cas ! Explications :</strong></p>
<p>MySQL utilise le moteur de stockage <a href="http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html" target="_blank"><em>MEMORY </em></a>pour la création des tables temporaires internes. Ce moteur se comporte quasiment comme <em>MyISAM</em>, cependant, une  contrainte  de ce moteur vient perturber le fonctionnement des tables temporaires internes : <strong>Il n&#8217;est pas possible d&#8217;utiliser des colonnes de type BLOB ou TEXT pour les tables <em>MEMORY</em>.</strong></p>
<p>De ce fait, si MySQL doit créer une table temporaire pour un ordre <em>SELECT </em>contenant ces types de colonne, elle sera automatiquement créée sur disque.</p>
<p>Deux possibilités s&#8217;offrent à vous dans ce cas :</p>
<ul>
<li>Limiter l&#8217;utilisation des colonnes de type BLOB ou TEXT</li>
<li>Monter un système de fichier mémoire pour le stockage des tables temporaires interne MySQL</li>
</ul>
<p>[ Cédric P ]<strong>Continuez votre lecture sur le blog :</strong>
<ul class="similar-posts">
<li><a href="http://blog.capdata.fr/index.php/que-faire-des-warning-aborted-connection-avec-mysql/" rel="bookmark" title="25 mars 2010">Que faire des &laquo;&nbsp;[Warning] Aborted connection&nbsp;&raquo; avec MySQL ?</a> (Cédric PEINTRE) [MySQL]</li>
<li><a href="http://blog.capdata.fr/index.php/how-to-reduire-la-taille-du-journal-de-transactions-sur-disque/" rel="bookmark" title="11 juillet 2011">How-To: réduire la taille du journal de transactions sur disque</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/openrowset-episode-1/" rel="bookmark" title="13 juillet 2011">OPENROWSET, épisode 1</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/error-8976-8978-problemes-de-chainage-comment-recuperer-les-donnees/" rel="bookmark" title="30 mai 2011">Error 8976 / 8978, problèmes de chaînage, comment récupérer les données</a> (David BAFFALEUF) [SQL Server]</li>
<li><a href="http://blog.capdata.fr/index.php/how-to-reduire-lenveloppe-de-tempdb/" rel="bookmark" title="7 juillet 2011">How-To : réduire l&#8217;enveloppe de tempdb</a> (David BAFFALEUF) [SQL Server]</li>
</ul>
<p><!-- Similar Posts took 3.677 ms -->
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fmysql-et-les-tables-temporaires-internes%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fmysql-et-les-tables-temporaires-internes%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.capdata.fr/index.php/mysql-et-les-tables-temporaires-internes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

