Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende ÜberarbeitungNächste ÜberarbeitungBeide Seiten der Revision | ||
dev:284:charsets [15.11.2018 00:48] – angelegt Manuela v.d.Decken | dev:284:charsets [28.12.2018 23:59] – [UTF-8 and PHP] Manuela v.d.Decken | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | + | ====== |
- | Charactersets, a complex and often confusing theme, in which a little light should be brought. | + | Zeichensätze, ein komplexes und oft auch verwirrendes Thema, in das ein klein wenig Licht gebracht werden soll. |
- | First and foremost, we have to note that at **PHP** | + | Zuallererst müssen wir festhalten, dass wir bei **PHP** |
- | To learn about the internals of UTF-8 you can visit **[[https:// | + | Um mehr über die Internas von UTF-8 zu erfahren, besuche einfach |
- | <div info> | + | <div info> |
+ | In diesem Dokument sind die Schreibweisen | ||
+ | Aber keine Sorge, das ganze Kapitel mit Zeichensätzen, | ||
+ | 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 and PHP ===== | + | ===== UTF-8 und PHP ===== |
- | PHP does not know any kind of 'Collation' | + | PHP selbst kennt weder 'Kollationen' |
- | UTF-8 in PHP exactly matches the definition | + | PHP kennt jedoch |
<div important> | <div important> | ||
- | Since a character encoded | + | Da in UTF-8 ein Zeichen mit 1, 2, 3 oder 4 Bytes dargestellt wird, funktionieren viele der 'alten' |
- | Please use the corresponding multibyte functions instead! i.e. **mb_strlen()** | + | Bitte benutzt stattdessen die jeweils korrespondierenden Multibyte Funktionen! z.B. **mb_strlen()** |
- | **Examples:** | + | |
- | ^ Char ^ Codepoint | + | **Beispiele:** |
+ | ^ Zeichen | ||
| a | U+0061 | 01100001 | LATIN SMALL LETTER A | | | a | U+0061 | 01100001 | LATIN SMALL LETTER A | | ||
| á | U+00E1 | 11000011 10100001 | LATIN SMALL LETTER A WITH ACUTE | | | á | U+00E1 | 11000011 10100001 | LATIN SMALL LETTER A WITH ACUTE | | ||
Zeile 25: | Zeile 30: | ||
</ | </ | ||
</ | </ | ||
- | ===== UTF-8 and mySQL ===== | + | ===== UTF-8 und mySQL ===== |
- | Unlike PHP, mySQL does not fully implement UTF-8 according to RFC 3629. | + | |
- | In mySQL, UTF-8 can only be one to three bytes maximum. As a result, mySQL can not store UTF-8 4-byte characters. | + | |
- | In order to solve this problem, the implementation of the UTF-8 character set was not changed, but subsequently the character set UTF-8MB4 was introduced. This character set can store any characters up to all 4 bytes. | + | |
- | Now please do not think that these signs would be the same!\\ | + | |
- | There is of course a difference that can be very important especially for larger databases. | + | |
- | The small but subtle difference is the memory consumption of these two charsets. | + | Im Gegensatz zu PHP implementiert mySQL nicht die vollständige RFC 3629 Definition von UTF-8. |
- | Whereas | + | In mySQL kann ein UTF-8 Zeichen nur maximal 3 Bytes groß sein. Daher kann mySQL keine 4-Byte Zeichen als UTF-8 speichern. |
+ | Um dieses Problem zu lösen, wurde jetzt nicht die UTF-8 Implementierung an die RFC angepasst, sondern es wurde ein neuer, zusätzlicher Zeichensatz 'UTF-8MB4' eingeführt. Dieser Zeichensatz kann jetzt auch 4-Byte Zeichen speichern. | ||
+ | Aber jetzt bitte nicht denken, UTF-8(PHP) und UTF-8MB4 wären das selbe!\\ | ||
+ | Da gibt es weiterhin einen wichtigen Unterschied, | ||
+ | Der kleine aber feine Unterschied besteht im Speicherverbrauch dieser beiden Zeichensätze. | ||
+ | Während UTF-8 dynamisch nur genau soviel Speicherplatz reserviert, wie ein Zeichen benötigt, beschlagnahmt UTF-8MB4 für jedes Zeichen grundsätzlich immer volle 4 Bytes. Sowohl im Arbeitsspeicher als auch in der Datenbank.Das erhöht natürlich den Speicherbedarf und beeinflusst sowohl die Verarbeitungszeit als auch die mögliche Genauigkeit von Indizes, die Größe der Indextabellen und dadurch auch die Zugriffszeiten. | ||
- | **Example of memory consumption** | + | **Beispiel Speicherverbrauch** |
- | ^ character set ^ needed memory | + | ^ Zeichensatz |
|"This is a little text in english, containing 54 signs." | |"This is a little text in english, containing 54 signs." | ||
| UTF-8: | 54 Byte | | | UTF-8: | 54 Byte | | ||
Zeile 44: | Zeile 49: | ||
| UTF-8MB4: | 64.000 Byte | | | UTF-8MB4: | 64.000 Byte | | ||
- | oops, your text is about 200 kB? You have lots of such? | + | oops, Dein Text ist um die 200.000 Zeichen groß? Du hast viele solcher Texte? |
+ | ===== UTF-8 und HTML ===== | ||
+ | Heutzutage sind alle modernen Browser in der Lage, UTF-8 codierte Zeichen darzustellen. Es gibt keinen Grund mehr, Sonderzeichen im HTML-Entity-Format auszugeben. | ||
+ | |||
+ | Auf jeden Fall ist es für den Browser hilfreich, wenigstens eins der folgenden Metatags im Head-Abschnitt eines HTML-Dokumentes auszugeben. | ||
+ | < | ||
+ | |||
+ | <meta charset=" | ||
===== Collations ===== | ===== Collations ===== | ||
- | <div info>\\ Collations | + | <div info>\\ Collations |
- | A collation has nothing to do with storage at first. It exclusively determines the rules according to which texts are sorted in the output. | + | 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**, | ||
- | Now, if we look at the selection list of possible collations, we find there for each character set a long list of possibilities. On the one hand, there are sortings that are optimized for one particular language and on the other hand values like | + | Der Unterschied zwischen |
- | The difference between **_unicode_ci** and **_general_ci** is mainly a different processing speed. | + | Auch die Sortierung ist unterschiedlich. ' |
- | The sorting with **_general_ci** works much faster, but a bit more inaccurate than with **_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 ' |
- | Since our databases are relatively small (10,000 entries | + | |
- | But no rule without exception. Text fields that contain only 7-bit characters (ASCII), such as `passwordhash`, | + | |
===== Links ===== | ===== Links ===== | ||
* [[https:// | * [[https:// |