<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/mysqlinfo.concepts.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'mysqlinfo.concepts.charset.php',
    1 => 'Juegos de caracteres',
    2 => 'Juegos de caracteres',
  ),
  'up' => 
  array (
    0 => 'mysqlinfo.concepts.php',
    1 => 'Conceptos',
  ),
  'prev' => 
  array (
    0 => 'mysqlinfo.concepts.buffering.php',
    1 => 'Consultas con o sin almacenamiento en memoria',
  ),
  'next' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'MySQLi',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/mysqlinfo/concepts.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqlinfo.concepts.charset" class="section">
  <h2 class="title">Juegos de caracteres</h2>

  <p class="simpara">
   Idealmente, un juego de caracteres adecuado debe ser definido
   a nivel del servidor, operación descrita en la sección
   <a href="http://dev.mysql.com/doc/mysql/en/charset-configuration.html" class="link external">&raquo;&nbsp;Configuración del juego de
    caracteres</a> del manual del servidor MySQL. Alternativamente, cada API
   MySQL ofrece un método para definir el juego de caracteres durante
   la ejecución.
  </p>

  <div class="caution"><strong class="caution">Precaución</strong>
   <h1 class="title">El juego de caracteres y el escape de caracteres</h1>
   <p class="simpara">
    El juego de caracteres debe ser comprendido y definido, sabiendo que tiene
    un efecto en cada acción, y tiene implicaciones a nivel de seguridad. Por ejemplo, el mecanismo de escape (i.e.
    <span class="function"><a href="mysqli.real-escape-string.php" class="function">mysqli_real_escape_string()</a></span> para mysqli, y
    <span class="methodname"><a href="pdo.quote.php" class="methodname">PDO::quote()</a></span> para PDO_MySQL) utilizará
    esta configuración. Es importante tener en cuenta que estas funciones
    no utilizarán el juego de caracteres definido con una consulta, por lo tanto,
    el ejemplo siguiente no tendrá ningún efecto sobre el juego de caracteres:
   </p>
  </div>

  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 Problemas al definir el juego de caracteres con SQL</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$mysqli </span><span style="color: #007700">= new </span><span style="color: #0000BB">mysqli</span><span style="color: #007700">(</span><span style="color: #DD0000">"localhost"</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_user"</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_password"</span><span style="color: #007700">, </span><span style="color: #DD0000">"world"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// NO afectará $mysqli-&gt;real_escape_string();<br /></span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"SET NAMES utf8mb4"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// NO afectará $mysqli-&gt;real_escape_string();<br /></span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">"SET CHARACTER SET utf8mb4"</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Pero esto afectará $mysqli-&gt;real_escape_string();<br /></span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">set_charset</span><span style="color: #007700">(</span><span style="color: #DD0000">'utf8mb4'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Pero esto NO lo afectará (UTF-8 en comparación con utf8mb4) -- no utilice guiones aquí<br /></span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">set_charset</span><span style="color: #007700">(</span><span style="color: #DD0000">'UTF-8'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <p class="simpara">
   A continuación, los ejemplos que demuestran cómo modificar correctamente
   el juego de caracteres durante la ejecución utilizando cada una de las APIs.
  </p>

  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <strong>Confusión posible con UTF-8</strong><br />
   <span class="simpara">
    Debido a que los nombres de los juegos de caracteres en MySQL no contienen guiones,
    la cadena &quot;utf8&quot; es correcta en MySQL y definirá el juego de caracteres en UTF-8.
    La cadena &quot;UTF-8&quot; no es correcta, y utilizar &quot;utf-8&quot; fallará al modificar el
    juego de caracteres.
   </span>
  </p></blockquote>

  <div class="example" id="example-2">
   <p><strong>Ejemplo #2 Ejemplo de definición del juego de caracteres: mysqli</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$mysqli </span><span style="color: #007700">= new </span><span style="color: #0000BB">mysqli</span><span style="color: #007700">(</span><span style="color: #DD0000">"localhost"</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_user"</span><span style="color: #007700">, </span><span style="color: #DD0000">"my_password"</span><span style="color: #007700">, </span><span style="color: #DD0000">"world"</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #DD0000">'Juego de caracteres inicial: ' </span><span style="color: #007700">. </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">character_set_name</span><span style="color: #007700">() . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br />if (!</span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">set_charset</span><span style="color: #007700">(</span><span style="color: #DD0000">'utf8mb4'</span><span style="color: #007700">)) {<br />    </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Error al cargar el juego de caracteres utf8mb4: %s\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">error</span><span style="color: #007700">);<br />    exit;<br />}<br /><br />echo </span><span style="color: #DD0000">'Su juego de caracteres actual es: ' </span><span style="color: #007700">. </span><span style="color: #0000BB">$mysqli</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">character_set_name</span><span style="color: #007700">() . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <div class="example" id="example-3">
   <p><strong>Ejemplo #3 Ejemplo de definición del juego de caracteres: <a href="ref.pdo-mysql.connection.php" class="link">pdo_mysql</a></strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$pdo </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">"mysql:host=localhost;dbname=world;charset=utf8mb4"</span><span style="color: #007700">, </span><span style="color: #DD0000">'my_user'</span><span style="color: #007700">, </span><span style="color: #DD0000">'my_pass'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div><?php manual_footer($setup); ?>