{"id":37,"date":"2008-09-18T20:18:00","date_gmt":"2008-09-18T20:18:00","guid":{"rendered":"http:\/\/www.olivierdoucet.info\/wordpress\/?p=37"},"modified":"2008-09-18T20:18:00","modified_gmt":"2008-09-18T20:18:00","slug":"stocker-un-booleen-dans-mysql","status":"publish","type":"post","link":"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/","title":{"rendered":"Stocker un bool\u00e9en dans MySQL"},"content":{"rendered":"<p>J&rsquo;ai vu pas mal de m\u00e9thodes pour stocker un bool\u00e9en dans SQL. Certaines sont vraiment \u00e0 \u00e9viter, d&rsquo;autres sont plus faciles, etc. Voici mon (humble) avis sur celles \u00e0 absolument \u00e9viter et les bonnes m\u00e9thodes.<br \/>\n<!--more--><br \/>\n!!!!M\u00e9thode 1: Stocker comme ENUM(&lsquo;0&prime;,&rsquo;1&rsquo;) Probablement la plus mauvaise id\u00e9e que vous pouvez avoir. Je m&rsquo;arrache les cheveux \u00e0 chaque fois que je vois \u00e7a dans le projet sur lequel je bosse actuellement (et dont je n&rsquo;ai pas fait la conception). Petite explication du pourquoi du comment. Soit une table membre, avec un champ `valide` de type ENUM(&lsquo;0&prime;,&rsquo;1&rsquo;), repr\u00e9sentant si le membre a valid\u00e9 son inscription ou non. Je veux savoir si le membre est valid\u00e9 : \/\/\/ SELECT id,nom FROM membre WHERE id=666 AND valide=1; (0 row(s)returned) \/\/\/ => pas d&rsquo;erreur, mais ne renvoie rien. Bizarre, j&rsquo;ai pourtant cru que c&rsquo;\u00e9tait bon. Je v\u00e9rifie : \/\/\/ SELECT id,nom FROM membre WHERE id=666 AND valide=0; (0 row(s)returned) \/\/\/ => pas d&rsquo;erreur, mais toujours rien retourn\u00e9. Damned! En effet, MySQL ne fait pas de typecasting, et pour lui, &lsquo;0&rsquo; ne vaut ni 1 ni 0. Deuxi\u00e8me soucis, c&rsquo;est si vous utilisez des fonctions de comparaison MySQL. Exemple : \/\/\/ select if (valide,&rsquo;ok&rsquo;,&rsquo;pas bon&rsquo;) FROM membre WHERE id=666; \/\/\/ => retourne &lsquo;ok&rsquo;, quelque soit la valeur de valide. En effet, une chaine de caract\u00e8re, m\u00eame &lsquo;0&rsquo;, est toujours vraie. !!!C\u00f4t\u00e9 stockage Chaque valeur ENUM est associ\u00e9e \u00e0 un index. Manque de bol, la 1e valeur a l&rsquo;index 1. Donc ENUM(&lsquo;0&prime;,&rsquo;1&rsquo;) donne les index &lsquo;0&rsquo; => 1 et &lsquo;1&rsquo; => 2. G\u00e9nial&#8230; L&rsquo;index 0 est utilis\u00e9 pour stocker une cha\u00eene vide (cas d&rsquo;erreur). [cf la doc MySQL.|http:\/\/dev.mysql.com\/doc\/refman\/5.0\/fr\/enum.html|fr] Enfin, pour ceux qui me parlent de performance, sachez qu&rsquo;un ENUM prend un ou deux octets en fonction du nombre de valeurs. Et si mes souvenirs sont bons, ENUM prend toujours 2 octets dans d&rsquo;anciennes versions de MySQL \u00a0\u00bb(\u00e0 v\u00e9rifier).\u00a0\u00bb%%% __Conclusion__ : on oublie. Note : ENUM() a \u00e9galement les m\u00eames soucis que VARCHAR(), donc n&rsquo;utilisez pas de stockage de chaine pour cela, point barre. !!!!M\u00e9thode 2: Stocker comme un entier (\u00a0\u00bbINTEGER\u00a0\u00bb). C&rsquo;est une bonne solution, reste \u00e0 choisir quel type de champ. Il en existe beaucoup : TINYINT, BIGINT, etc. Leur diff\u00e9rence ? Ils permettent de stocker des entiers plus ou moins grand. Comme nous voulons juste stocker 2 valeurs, autant prendre le moins couteux, \u00e0 savoir TINYINT, qui ne prend qu&rsquo;un seul octet en m\u00e9moire. En d\u00e9finissant votre champ sur TINYINT(1), vous limitez m\u00eame les erreurs. Pour les curieux qui veulent savoir l&rsquo;espace de stockage n\u00e9c\u00e9ssaire et l&rsquo;intervalle de chaque type de colonne,[ la documentation est l\u00e0 pour \u00e7a.|http:\/\/dev.mysql.com\/doc\/refman\/5.0\/fr\/numeric-types.html|fr] !!!!M\u00e9thode 3: Stocker comme un champ de type BIT(1) Solution relativement r\u00e9cente (BIT a \u00e9t\u00e9 int\u00e9gr\u00e9 dans MySQL 5.0.3). Niveau stockage c&rsquo;est pas forc\u00e9ment tr\u00e8s efficace, car BIT(1) prend quand m\u00eame un octet. Il est question d&rsquo;am\u00e9liorer cette gestion dans de prochaines versions de MySQL. Par contre niveau utilisation c&rsquo;est pas vraiment simple. !!!Insertion: \/\/\/ INSERT INTO matable VALUES (b&rsquo;1&prime;); INSERT INTO matable VALUES (0b1); INSERT INTO matable VALUES (b&rsquo;0&prime;); INSERT INTO matable VALUES (0b0); \/\/\/ !!!Pour la r\u00e9cup\u00e9ration &#8230; &#8230;, y&rsquo;a une astuce. En effet, \u00a0\u00bbSELECT monchamp FROM matable\u00a0\u00bb vous renverra de jolis signes cabalistique. En effet, MySQL vous renvoie la valeur binaire. Pour r\u00e9cup\u00e9rer l&rsquo;entier, plusieurs m\u00e9thodes: \/\/\/ SELECT monchamp+0 from test; SELECT bin(champ) from test; SELECT oct(champ) from test; SELECT hex(champ) from test; \/\/\/ Attention si vous stockez plus qu&rsquo;un bool\u00e9en (BIT(M) avec M>1), les s\u00e9lections ci-dessus auront alors des comportements diff\u00e9rents entre elles. Comme toujours, [RTFM|http:\/\/dev.mysql.com\/doc\/refman\/5.0\/fr\/bit-field-values.html|fr]. !!!!Conclusion Personnellement, je recommanderais de stocker des bool\u00e9ens dans un champ TINYINT(1). C&rsquo;est ce qui est le plus simple \u00e0 utiliser. BIT reste un peu trop complexe pour peu\/aucun gain de performance.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai vu pas mal de m\u00e9thodes pour stocker un bool\u00e9en dans SQL. Certaines sont vraiment \u00e0 \u00e9viter, d&rsquo;autres sont plus faciles, etc. Voici mon (humble) avis sur celles \u00e0 absolument \u00e9viter et les bonnes m\u00e9thodes.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[42,36,29],"class_list":["post-37","post","type-post","status-publish","format-standard","hentry","category-php-sql","tag-enum","tag-mysql","tag-php"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Stocker un bool\u00e9en dans MySQL - My thoughts<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Stocker un bool\u00e9en dans MySQL - My thoughts\" \/>\n<meta property=\"og:description\" content=\"J&#039;ai vu pas mal de m\u00e9thodes pour stocker un bool\u00e9en dans SQL. Certaines sont vraiment \u00e0 \u00e9viter, d&#039;autres sont plus faciles, etc. Voici mon (humble) avis sur celles \u00e0 absolument \u00e9viter et les bonnes m\u00e9thodes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/\" \/>\n<meta property=\"og:site_name\" content=\"My thoughts\" \/>\n<meta property=\"article:published_time\" content=\"2008-09-18T20:18:00+00:00\" \/>\n<meta name=\"author\" content=\"olivier\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@odoucet\" \/>\n<meta name=\"twitter:site\" content=\"@odoucet\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"olivier\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/\",\"url\":\"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/\",\"name\":\"Stocker un bool\u00e9en dans MySQL - My thoughts\",\"isPartOf\":{\"@id\":\"https:\/\/www.olivierdoucet.info\/blog\/#website\"},\"datePublished\":\"2008-09-18T20:18:00+00:00\",\"author\":{\"@id\":\"https:\/\/www.olivierdoucet.info\/blog\/#\/schema\/person\/2a02230ae6aeac086b3379e5853c6f96\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.olivierdoucet.info\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Stocker un bool\u00e9en dans MySQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.olivierdoucet.info\/blog\/#website\",\"url\":\"https:\/\/www.olivierdoucet.info\/blog\/\",\"name\":\"My thoughts\",\"description\":\"En fran\u00e7ais and in english :)\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.olivierdoucet.info\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.olivierdoucet.info\/blog\/#\/schema\/person\/2a02230ae6aeac086b3379e5853c6f96\",\"name\":\"olivier\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.olivierdoucet.info\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/febd16d726b2266a512e951d03424de3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/febd16d726b2266a512e951d03424de3?s=96&d=mm&r=g\",\"caption\":\"olivier\"},\"sameAs\":[\"http:\/\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Stocker un bool\u00e9en dans MySQL - My thoughts","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/","og_locale":"fr_FR","og_type":"article","og_title":"Stocker un bool\u00e9en dans MySQL - My thoughts","og_description":"J'ai vu pas mal de m\u00e9thodes pour stocker un bool\u00e9en dans SQL. Certaines sont vraiment \u00e0 \u00e9viter, d'autres sont plus faciles, etc. Voici mon (humble) avis sur celles \u00e0 absolument \u00e9viter et les bonnes m\u00e9thodes.","og_url":"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/","og_site_name":"My thoughts","article_published_time":"2008-09-18T20:18:00+00:00","author":"olivier","twitter_card":"summary_large_image","twitter_creator":"@odoucet","twitter_site":"@odoucet","twitter_misc":{"\u00c9crit par":"olivier","Dur\u00e9e de lecture estim\u00e9e":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/","url":"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/","name":"Stocker un bool\u00e9en dans MySQL - My thoughts","isPartOf":{"@id":"https:\/\/www.olivierdoucet.info\/blog\/#website"},"datePublished":"2008-09-18T20:18:00+00:00","author":{"@id":"https:\/\/www.olivierdoucet.info\/blog\/#\/schema\/person\/2a02230ae6aeac086b3379e5853c6f96"},"breadcrumb":{"@id":"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.olivierdoucet.info\/blog\/2008\/09\/18\/stocker-un-booleen-dans-mysql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.olivierdoucet.info\/blog\/"},{"@type":"ListItem","position":2,"name":"Stocker un bool\u00e9en dans MySQL"}]},{"@type":"WebSite","@id":"https:\/\/www.olivierdoucet.info\/blog\/#website","url":"https:\/\/www.olivierdoucet.info\/blog\/","name":"My thoughts","description":"En fran\u00e7ais and in english :)","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.olivierdoucet.info\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/www.olivierdoucet.info\/blog\/#\/schema\/person\/2a02230ae6aeac086b3379e5853c6f96","name":"olivier","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.olivierdoucet.info\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/febd16d726b2266a512e951d03424de3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/febd16d726b2266a512e951d03424de3?s=96&d=mm&r=g","caption":"olivier"},"sameAs":["http:\/\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.olivierdoucet.info\/blog\/wp-json\/wp\/v2\/posts\/37","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.olivierdoucet.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.olivierdoucet.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.olivierdoucet.info\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.olivierdoucet.info\/blog\/wp-json\/wp\/v2\/comments?post=37"}],"version-history":[{"count":0,"href":"https:\/\/www.olivierdoucet.info\/blog\/wp-json\/wp\/v2\/posts\/37\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.olivierdoucet.info\/blog\/wp-json\/wp\/v2\/media?parent=37"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.olivierdoucet.info\/blog\/wp-json\/wp\/v2\/categories?post=37"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.olivierdoucet.info\/blog\/wp-json\/wp\/v2\/tags?post=37"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}