Donnerstag, 20. Oktober 2011

Technische Unterschiede PostgreSQL, MySQL, MariaDB - Teil 9

Die vorangegangenen Teile dieser Artikelserie sind hier:


  1. http://miraspostgresqlwelt.blogspot.com/2011/08/technische-unterschiede-postgresql.html 
  2. http://miraspostgresqlwelt.blogspot.com/2011/08/technische-unterschiede-postgresql_30.html
  3. http://miraspostgresqlwelt.blogspot.com/2011/08/technische-unterschiede-postgresql_31.html
  4. http://miraspostgresqlwelt.blogspot.com/2011/09/technische-unterschiede-postgresql.html
  5. http://miraspostgresqlwelt.blogspot.com/2011/09/technische-unterschiede-postgresql_02.html
  6. http://miraspostgresqlwelt.blogspot.com/2011/09/technische-unterschiede-postgresql_06.html
  7. http://miraspostgresqlwelt.blogspot.com/2011/09/technische-unterschiede-postgresql_16.html
  8. http://miraspostgresqlwelt.blogspot.com/2011/09/technische-unterschiede-postgresql_28.html 
Datentypen

PostgreSQL hat eine ganze Reihe von eigenen Datentypen, die nicht im SQL Standard erfasst sind. Auch MySQL kennt ein paar mehr als der Standard. Daneben besteht in PostgreSQL noch die Möglichkeit eigene Datentypen zu kreieren.

Ich gehe hier nur auf die wichtigsten Datentypen ein:

PostgreSQL hat Boolean implementiert - bei MySQL ist Boolean nur ein
Alias auf Tinyint (1 Byte). Ein NOT NULL Boolean lässt sich bei MySQL auch
durch einen CHAR(0) simmulieren. CHAR(0) lässt genau zwei Werte zu: NULL und Empty String. Es bleibt dabei dem Anwender überlassen was er als TRUE und was als FALSE definiert.

Tinyint (1 Byte), Mediumint (3 Byte) sind MySQL eigene. Daneben kann in
MySQL noch zwischen signed und unsigned unterschieden werden.

Smallint (2 Byte), Integer (4 Byte) und Bigint (8 Byte) sind in beiden
Systemen vorhanden.

Verwirrend ist hier nur, dass MySQL von INT(m) spricht. Das m steht nicht
etwa für die Bittigkeit. NEIN!! Auch ein INT(27) ist ein normaler 4-Byte
Integer und kein Bigint. Die Zahl sagt nur aus, mit wievielen Leerzeichen
die Ausgabe ausgefüllt werden soll, damit die Zahlen rechtsbündig
untereinander stehen.

Decimal und Numeric sind SQL Standard. Beide sind bei beiden implementiert. Bei PostgreSQL ist Decimal ein Alias auf Numeric, bei MySQL ist es genau anders herum.


Float, Real und Double Precision sind SQL Standard Typen.
PostgreSQL hat Real (4 Byte) und Double Precision (8 Byte) implementiert. Float ist bei PostgreSQL ein Alias für Double Precision.

MySQL kennt Float (4 Byte) und Double (8 Byte). Real ist ein Alias auf Float
und Double Precision ein Alias auf Double. Gerechnet wird bei MySQL jedoch immer mit Double Precision, was bei der Verwendung von Float zu erheblichen
Rundungsfehlern führen kann.

Char und Varchar kennen beide.
Darüber hinaus kennen beide den nicht im Standard stehenden Datentyp Text.

Bei MySQL zählt Text jedoch zu den Blob-Typen. Bei PostgreSQL zu Varchar.
Von diesen Dreien ist bei MySQL Char der schnellste und Text der
langsamste Datentyp. Bei PostgreSQL sind alle drei gleich schnell.
MySQLs Varchar kann maximal eine Länge von 2¹⁶-1 haben. Char ist bei MySQL auf 255 Zeichen beschränkt.

MySQL kennt verschieden Blob-Datentypen. PostgreSQL nutzt hier Bitea.

Date kennen beide. PostgreSQL kann hier noch mit vorchristlichen Daten
umgehen, MySQL nicht.

Der SQL Standard sagt Time und Timestamp sind ohne Angabe einer Zeitzone.
Time bzw. Timestamp with timezone sind mit Angabe der Zeitzone.
PostgreSQL hat dieses auch brav genau so implementiert. Auch der im Standard stehen Datentyp Interval ist bei PostgreSQL vorhanden.

MySQL kennt die Datentypen WITH TIMEZONE nicht. Es kenn auch den Datentyp Interval nicht. Es kennt Time, Timestamp und Datetime. Den wesentlichen Unterschied von Datetime und Timestamp habe ich schon erklärt. Die Zeitzone wird hier nicht festgehalten. Der Unix-Timestamp wird hier anhand der im Server eingestellten Zeitzone berechnet. Bei MySQL ist es daher wichtig, dass alle Zeiten mit selber Zeitzone in die Datenbank gelangen.

Die Funktionen und Berechnungsformeln für Datums- und Zeitdatentypen
sind erheblich unterschiedlich.

Nicht Standard aber nützlich sind in MySQL noch der Datentyp Enum, der in
PostgreSQL erst selbst erstellt werden muß, bevor er verwendet werden kann.
Und in PostgreSQL der Datentyp Array, der in MySQL nicht existiert.

Fortsetzung folgt ...