<?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 => 'de',
  ),
  'this' => 
  array (
    0 => 'mysqlinfo.concepts.charset.php',
    1 => 'Zeichens&auml;tze',
    2 => 'Zeichens&auml;tze',
  ),
  'up' => 
  array (
    0 => 'mysqlinfo.concepts.php',
    1 => 'Konzepte',
  ),
  'prev' => 
  array (
    0 => 'mysqlinfo.concepts.buffering.php',
    1 => 'Gepufferte und ungepufferte Abfragen',
  ),
  'next' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'Mysqli',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    '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">Zeichensätze</h2>

  <p class="simpara">
   Idealerweise sollte der richtige Zeichensatz auf Serverebene eingestellt
   werden. Dies wird im Abschnitt
   <a href="http://dev.mysql.com/doc/mysql/en/charset-configuration.html" class="link external">&raquo;&nbsp;Character Set Configuration</a>
   des Handbuchs zum MySQL-Server beschrieben. Alternativ dazu bietet jede
   MySQL-API eine Methode, um den Zeichensatz zur Laufzeit zu setzen.
  </p>

  <div class="caution"><strong class="caution">Achtung</strong>
   <h1 class="title">Der Zeichensatz und die Maskierung von Zeichen</h1>
   <p class="simpara">
    Da sich der Zeichensatz auf jede Aktion auswirkt und auch Auswirkungen auf
    die Sicherheit hat, sollte er bekannt und definiert sein. Zum Beispiel
    orientiert sich der Mechanismus für das Maskieren (z. B.
    <span class="function"><a href="mysqli.real-escape-string.php" class="function">mysqli_real_escape_string()</a></span> bei mysqli und
    <span class="methodname"><a href="pdo.quote.php" class="methodname">PDO::quote()</a></span> bei PDO_MySQL) an dieser Einstellung.
    Es ist wichtig zu wissen, dass diese Funktionen nicht den Zeichensatz
    verwenden, der für eine Abfrage definiert ist, sodass z. B. Folgendes
    keinen Einfluss auf sie hat:
   </p>
  </div>

  <div class="example" id="example-1">
   <p><strong>Beispiel #1 Probleme beim Einstellen des Zeichensatzes mit 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">// Wirkt sich NICHT auf $mysqli-&gt;real_escape_string(); aus<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">// Wirkt sich NICHT auf $mysqli-&gt;real_escape_string(); aus<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">// Allerdings wirkt sich das auf $mysqli-&gt;real_escape_string(); aus<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">// Aber das wirkt sich NICHT aus (UTF-8 vs. utf8mb4) - hier keine Bindestriche verwenden<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">
   Die folgenden Beispiele zeigen, wie der Zeichensatz mit der jeweiligen API
   korrekt zur Laufzeit geändert werden kann.
  </p>

  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <strong>Möglicher Fehler mit UTF-8</strong><br />
   <span class="simpara">
    Da die Namen von Zeichensätzen in MySQL keine Bindestriche enthalten, muss
    in MySQL die Zeichenkette &quot;utf8&quot; verwendet werden, um den Zeichensatz auf
    UTF-8 zu setzen (bis zu 3 Byte UTF-8 Unicode Encoding). Die Zeichenkette
    &quot;UTF-8&quot; ist dagegen ungültig, weshalb der Zeichensatz mit &quot;UTF-8&quot; nicht
    geändert werden kann und ein Fehler ausgegeben wird.
   </span>
  </p></blockquote>

  <div class="example" id="example-2">
   <p><strong>Beispiel #2 Beispiel für das Einstellen des Zeichensatzes: 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">'Der ursprüngliche Zeichensatz: ' </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">"Fehler beim Laden des Zeichensatzes 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">'Der aktuelle Zeichensatz: ' </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>Beispiel #3 Beispiel für das Einstellen des Zeichensatzes: <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); ?>