====== Zeichensätze ======
Zeichensätze, ein komplexes und oft auch verwirrendes Thema, in das ein klein wenig Licht gebracht werden soll.
Zuallererst müssen wir festhalten, dass wir bei **PHP** strikt die Multibyte-Codierung von UTF-8 verwenden.
Um mehr über die Internas von UTF-8 zu erfahren, besuche einfach **[[https://en.wikipedia.org/wiki/UTF-8|Wikipedia - UTF-8]]**
\\ Beides, UTF-8 und UTF-8MB4 aus mySQL ist 100% kompatibel zu UTF-8 aus PHP.\\
In diesem Dokument sind die Schreibweisen  **utf8**||**utf-8** sowie **utf8mb4**||**utf-8mb4** gleichbedeutend.
Aber keine Sorge, das ganze Kapitel mit Zeichensätzen, Sortierungen und so weiter ist eigentlich nur halb so kompliziert, wie es auf den ersten Blick aussehen mag.\\
Die Kenntnisse über die Zeichensätze in der Datenbank sind nur wirklich wichtig, wenn man selbst neue Datenbanktabellen entwirft.\\
Für Programmierer ist es wichtiger, den Umgang mit den Multibyte-Stringfunktionen von PHP zu beherrschen. Denn wenn man diese nicht richtig verstanden hat, kann es durchaus in schweren Fehlern enden.
===== UTF-8 und PHP =====
PHP selbst kennt weder 'Kollationen' noch 'UTF-8MB4' noch ähnliches! Diese Dinge können bei PHP vergessen werden!
PHP kennt jedoch UTF-8. Und zwar jenes, das exakt den Definitionen in **[[https://tools.ietf.org/html/rfc3629|RFC 3629]]** / **ISO/IEC 10646-1:2000 Annex D** entspricht und welches aus 1 bis 4 Bytes für jedes Zeichen besteht. UTF-8 (wie auch alle Latin_xxx Zeichensätze) ist in den ersten 128 Zeichen identisch zu der originalen ASCII Zeichentabelle.
Da in UTF-8 ein Zeichen mit 1, 2, 3 oder 4 Bytes dargestellt wird, funktionieren viele der 'alten' Stringfunktionen nicht mehr korrekt!\\
Bitte benutzt stattdessen die jeweils korrespondierenden Multibyte Funktionen! z.B. **mb_strlen()** anstatt **strlen()**
**Beispiele:**
^ Zeichen ^ Codepunkt ^ UTF-8 (bin) ^ Benennung ^
|  a  | U+0061 | 01100001 | LATIN SMALL LETTER A |
|  á  | U+00E1 | 11000011 10100001 | LATIN SMALL LETTER A WITH ACUTE |
|  ä  | U+00E4 | 11000011 10100100 | LATIN SMALL LETTER A WITH DIAERESIS |
|  🤩  | U+1F929 | 11110000 10011111 10100100 10101001 | GRINNING FACE WITH STAR EYES |
 echo strlen('a');  =>  1  ||  echo mb_strlen('a');  =>  1 
 echo strlen('á');  =>  2  ||  echo mb_strlen('á');  =>  1 
 echo strlen('ä');  =>  2  ||  echo mb_strlen('ä');  =>  1 
 echo strlen('🤩');  =>  4  ||  echo mb_strlen('🤩');  =>  1 
\\ Collations existieren nicht in PHP. Diese sind nur Eigenschaften von Textfeldern in Datenbanktabellen!
Eine Collation hat mit Codierung und Speicherung erst einmal nichts zu tun. Sie bestimmt nur die Regeln, nach denen Texte für die Ausgabe sortiert und verglichen werden.
Nun, wenn wir auf die Auswahliste der möglichen Collations schauen, dann finden wir für praktisch jeden Zeichensatz eine lange Liste an Möglichkeiten. Einerseits sind da Collations die auf eine einzelne Sprache optimiert sind, andererseits finden wir auch Werte wie **_unicode_ci** und **_general_ci**, welche sprachübergreifend arbeiten.\\
Der Unterschied zwischen **_unicode_ci** und **_general_ci** ist hauptsächlich eine deutlich unterschiedliche Verarbeitungsgeschwindigkeit.
Auch die Sortierung ist unterschiedlich. 'unicode_ci' berücksichtig die wesentlichen Eigenheiten vieler Sprachen, während 'general_ci' rein Buchstabenorientiert arbeitet. Die Sortierung mit 'general_ci' ist deutlich schneller, aber auch viel weniger sprachbezogen und daher ungenauer als 'unicode_ci'.\\
Da unsere Datenbanken (auch die größten) relativ klein sind (10.000 Datensätze ist in der Welt der Datenbanken fast nichts) und auch im Hinblick auf die Mehrsprachigkeit, benutzen wir normalerweise immer die 'unicode_ci' Collation um die UTF-8MB4 Texte zu sortieren.\\
===== Links =====
  * [[https://en.wikipedia.org/wiki/UTF-8|Wikipedia UTF-8]]
  * [[https://tools.ietf.org/html/rfc3629|RFC 3629]] / STD 63 (2003), which establishes UTF-8 as a standard Internet protocol element
  * [[https://www.unicode.org/versions/Unicode11.0.0/|The Unicode Standard, Version 11.0]], §3.9 D92, §3.10 D95 (2018 June 5)
  * [[http://www.iso.org/iso/home/store/catalogue_ics/catalogue_detail_ics.htm?csnumber=63182|ISO/IEC 10646:2014 §9.1]]
  * [[http://doc.cat-v.org/plan_9/4th_edition/papers/utf|Original UTF-8 paper]] [[https://web.archive.org/web/20000917055036/http://plan9.bell-labs.com/sys/doc/utf.pdf|(or pdf)]] for [[https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs|Plan 9 from Bell Labs]]