niedenzu

Hints and tricks for developers

Martins Amazon Wunschliste

Function to calculate amount of labour days between two dates 6. December 2016

To determin the eleapsed time in days for in insurence company we had to dynamicly
calculate them.

In an earlier project we realized that it wasn’t a good idea to run a batch thats precalculates the values.

The almausr.feiertag table is used to save holidays.
(It’s the german word for holiday).

No Comments on Function to calculate amount of labour days between two dates
Tags: ,
Categories: DB2 SQL

MySql, DB2 und postgresql 20. January 2015

Wie entwickelt und betreibt man eine SQL-Datenbank bzw. ein Datenmodel das
folgende Vorteile bietet.

  • Unterstützung von UTF8. Da die Welt groß ist sollte man alle Schrifzeichen speichern können.
    Meine Kunden betreiben u.a. Sites für Korea und China.
  • Es soll auf verschiedene Datenbanksystemen arbeiten.
    Dadurch erhält man Herstellerunabhängigkeit
    Unabhängigkeit des Betriebsystems.
  • Nach Möglichkeit sollte alle Datenbanken mit den gleichen Tools bedient werden
  • Die Datenbanken sollten eine Unterstüzung für die Programmiersprachen Java und PHP bieten.

Unterstüzung der Programmiersprachen Java und PHP

Warum dies 2 Sprachen? Weil diese Sprachen serverseitig ausgeführt werden und diese
laut RedMonk die wichtigsten Programmiersprachen sind. Top 20.
JavaScript fällt aktuell noch weg, da es aktuell haupsächlich im Browser ausgeührt wird.

  1. Java
  2. JavaScript
  3. PHP

Datenbanken mit den gleichen Tools bedient werde

Die verwendung eines einheitlichen Tools macht sinn. Wir müssen glaube ich nicht weiter darauf eingehen warumg es besser ist ein Tool zu verwenden stat drei.

Warum man sich mit dem Trio beschäftigen sollte.

MySQL

Wenn man mit dem Internet arbeitet kommt man um diese Datenbank nicht herum.
MySQL läuft auf den gängigen Betriebsystemen. Was mir wichtig war, dass es
auf Windows, Linux und Mac OS X läuft.
Wenn man preisgünstig dynamische Seiten bei einem Provider hosten möchte sollte man php verwenden,
da dies von den Providern unterstützt wird und die Anbindung an MySQL Problemlos funktioniert.

DB2

Wird bei den meisten meiner Kunden verwendet.
Dies ist auch die Datenbank mir der ich mich am besten auskenne.
Leider läuft die Datenbank nicht auf meinem Mac.
Die alternative eine Virtuelle Machine zu verwenden war mir zu anstrengend.
Am liebsten arbeite ich mit meinem Macbook-Air. Da ist es für mich extrem wichtig
so wenig Resource wie nötig zu beanspruchen. Deshalb fällt DB2 für den Mac weg.

Postgress

Läuft auch auf Windows, Linux und Mac OS X.
Hat einen super kleinen Foot-Print.
Die Datentypen sind fast identisch zu DB2.

Wie kann man diese Ziele erreichen

Man sollte sich nach Möglichket auf wenige Datentypen beschränken.
Es gibt Datentypen die sind auf den 3 Datenbanken identisch z.B. BIGINT.
Bei Datenbanken die für bestimmte Datentypen anderen Namen haben arbeitet das Datenbankmanagementsystem wie folgt.
Die allgemeingültigen Datentypen werden in Datentypen umgewandelt die von der
Datenbank unterstützt werden.

Ein paar Tips vorweg

Sie sollten immer nummerische Datentypen als Primärschlüssel einer Tabelle verwenden.
Der Primärschlüssel sollte von der Datebank generiert werden und nicht durch ihr Programm vergeben werden.
So ist auch gewährleistet, dass ein Cluster von Applikationsservern parallel auf die Datenbank opperieren kann.
Es sollte auf den BOOLEAN Datentyp verzichtet werden. Ein Boolean kann entweder true oder false sein.
Es kann passieren, dass diese 2 Ausprägungen nicht mehr ausreichen. Dann haben Sie ein Problem. Besser ist es
CHAR(1) zu nehmen und ‘1’ oder ‘0’ zu speichern. Falls Sie dann dann doch einen andere Ausprägung benötigen dann ist das problemlos möglich (z.B. ‘2’ ).
Verwenden Sie auch nicht INT. Dies kann zu problemen führen wenn Sie INT und BIGINT miteinander vergleichen. Ausserdem ist der Wertebereich eingeschränkt. Mit einem BIGINT sind sie wesentlich flexibler.
Die Zeiten in denen ein INT gegeüber einem BIGINT schnelle waren sind vorbeit. Dies liegt u.a. daran dass die meisten Betriebsysteme heutzutage 64-Bit Systeme sind.
VARCHAR(X) nicht zu klein dimensionieren. Besonders dann wenn sie mit asiatischen Zeichen arbeiten kommt es hierbei zu Problemen. Wenn Sie ein UTF8 Zeichen speichern wollen kann bis zum vierfachen an Zeichen in der Datebank verwendet werden. Wenn Sie auf nummersicher gehen wollen sollten sie die vierfache Länge in der Datenbank zulassen und die GUI bzw. Web-GUI auf die einfache Datenlänge beschränken.

Das Arbeiten mit unicode sollte out-of-the-box funktionieren

dies ist leider nicht der Fall. Die gute Nachricht ist. Das alle 3 Datenbanken dies aber können.
Man muss es nur richtig einstellen.

MySQL

Wenn Sie eine MySQL-Datenbank anlegen sollten Sie sie mit der richtigen Kollation anlegen.
Es werden verschieden Kollationen angeboten die einzige die mir sinnvoll erscheint ist dabei utf8_unicode_ci.

Wenn Sie Java-basierte tools zur Entwicklung verwenden müssen Sie im Connection String mitteilen, dass
die Datenbank die sie verwenden UTF8 verwendet.

Bei mysql muss unbeding folgender Parameter mitgegeben werden.


jdbc:mysql://localhost:8889/integrator?useUnicode=true&characterEncoding=utf-8

Danach kann man die SQL-Statements wie gewohnt laufen lassen.

DB2

Bei DB2 kommt es darauf an mit welchem Zeichensatz die Datebank angelegt wurde. Achten Sie bei der Anlage darauf das dies geschehen ist. Sollten Sie eine leere Datebank im falschen Zeichensatz erhalten (z.B. ASCII) dann tauschen Sie diese sofort gegen eine UTF8 Datenbank ein. Bei einem unserer früheren Kunden war die Datenbank im falschen Zeichensatz. Dies lag daran, dass die Datebank sehr alt war (über 15 Jahre) und damals noch keiner an UTF8 gedacht hatte. Die Datenbank war für den Europäischen und amerikanischen Markt konzipiert. Durch diese Tatsache mussten wir ein paar Tricks anwenden um die Daten dennoch zu speichern. Leider war eine Migration auf UTF8 auch nicht möglich, da zu viele Programme auf diese wichtige und sehr große Datenbank zugegriffen haben. Eine Umstellung ist und war wirtschaflich nicht möglich.

Bei DB2-Datenbanken sollte der Connection Strig wie folgt aussehen.

jdbc:db2://myserver.de:50000/DB2T:retrieveMessagesFromServerOnGetMessage=true;

Dies bringt den Vorteil, dass Fehlermeldung nicht mit kryptischen Codes ausgegeben werden, sondern eine sprechende Fehlermeldung angezeigt werden.

Postgres

jdbc:postgresql://localhost:5432/postgres
postgress_jdbc

Im folgenden Beispiel existieren folgende Verzeichnisse
C:\Daten\pgsql in diesem Verzeichnis ist das DBMS installiert.
c:\Daten\pgsql-data leerer Ordner indem die Daten der Datebank die wir anlegen abgelegt werden soll.

Anlegen der Dateban psql-data
C:\Daten\pgsql\bin> initdb -D c:\Daten\pgsql-data - E UTF


C:\Daten\pgsql\bin>postgres -D c:\Daten\pgsql-data
LOG:  Datenbanksystem wurde am 2014-10-17 14:00:53 CEST heruntergefahren
LOG:  Datenbanksystem ist bereit, um Verbindungen anzunehmen
LOG:  Autovacuum-Launcher startet

Verbindung mit user ohne Passwd

C:\Daten\pgsql\bin>psql -l
                                        Liste der Datenbanken
   Name    | Eigent³mer | Kodierung |    Sortierfolge     |     Zeichentyp      | Zugriffsprivilegien
-----------+------------+-----------+---------------------+---------------------+---------------------
 postgres  | x115293    | UTF8      | German_Germany.1252 | German_Germany.1252 |
 template0 | x115293    | UTF8      | German_Germany.1252 | German_Germany.1252 | =c/x115293         +
           |            |           |                     |                     | x115293=CTc/x115293
 template1 | x115293    | UTF8      | German_Germany.1252 | German_Germany.1252 | =c/x115293         +
           |            |           |                     |                     | x115293=CTc/x115293
(3 Zeilen)

PostgreSQL has the data types smallserial, serial and bigserial; these are not true types, but merely a notational convenience for creating unique identifier columns. These are similar to AUTO_INCREMENT property supported by some other databases.
If you wish a serial column to have a unique constraint or be a primary key, it must now be specified, just like any other data type.
The type name serial create integer columns. The type name bigserial create a bigint column. bigserialshould be used if you anticipate the use of more than 231 identifiers over the lifetime of the table. The type name smallserial create a smallint column.

GENERAL MySql DB2 Postgres
SERIAL SERIAL PK_LAND bigint primary key not null generated by default as identity SERIAL
BIGINT BIGINT BIGINT INT8
VARCHAR(X) VARCHAR(X) VARCHAR(X) VARCHAR(X)
CHAR(X) CHAR(X) CHAR(32) BPCHAR(32)
TIMESTAMP NOT NULL xxx xxx TIMESTAMP NOT NULL
L_AEND TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL xxx xxx l_aend TIMESTAMP DEFAULT now() NOT NULL,

TIMESTAMP DEFAULT now() NOT NULL

No Comments on MySql, DB2 und postgresql
Tags: ,
Categories: DB2
Martin Rocks