hallo forum,
eine frage: mir wurde früher beigebracht, dass man
tabellenfelder immer möglichst klein wählen sollte.
aber gilt dies auch für den typ VARCHAR? laut
mySQL-handbuch benötigen dieser type immer L+1
bytes (solange L
hallo forum,
eine frage: mir wurde früher beigebracht, dass man
tabellenfelder immer möglichst klein wählen sollte.
aber gilt dies auch für den typ VARCHAR? laut
mySQL-handbuch benötigen dieser type immer L+1
bytes (solange L
Hallo,
im Prinzip hast du recht.
Allerdings kann es Probleme geben wenn die Daten wachsen.
Bei Oracle ist das auf Jeden Fall so:
Wenn man VARCHARS verwendet reserviert man etwas Platz auf jeder Speicherseite, den man nicht durch INSERTs füllen kann, sondern nur durch UPDATES. Dann können diese Felder innerhalb einer Speicherseite wachsen. Werden die Felder zu groß, muss ein Verweis auf die nächste Speicherseite gesetzt werden. Folge: der Zugriff wird langsamer.
Übrigens: ein Char oder Varchar benötigt 1 Byte pro Zeichen. Für Sonderzeichen 2. Das wird gerne übersehen.
Gruß
Peter
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
hallo peter,
habe vielen dank für deine antwort. da meine datenbank
maximal 5.000 datensätze haben wird, ist die
verlangsamung wahrscheinlich zu vernachlässigen.
werde also ein wenig großzügiger bei den VARCHARS
sein.
beste grüße
CHA
Hallo Peter,
Übrigens: ein Char oder Varchar benötigt 1 Byte pro Zeichen.
Für Sonderzeichen 2. Das wird gerne übersehen.
So unpräzise? Das bin ich von dir gar nicht gewohnt.
SQL\> conn sys@dev1 as sysdba
Connected.
SQL\> select dump('@') from dual;
DUMP('@')
----------------
Typ=96 Len=1: 64
SQL\> select dump('ô') from dual;
DUMP('Ô')
-----------------
Typ=96 Len=1: 244
SQL\> select dump('Æ') from dual;
DUMP('Æ')
-----------------
Typ=96 Len=1: 198
Also doch nur ein Byte, auch bei Sonderzeichen? Der Peter wird das doch wohl nicht erfunden haben? Das probieren wir doch glatt noch auf einer anderen DB:
SQL\> disconn
Disconnected from Oracle Database 10g Release 10.2.0.1.0
SQL\> conn sys@dev2 as sysdba
Connected.
SQL\> select dump('@') from dual;
DUMP('@')
----------------
Typ=96 Len=1: 64
SQL\> select dump('ô') from dual;
DUMP('Ô')
---------------------
Typ=96 Len=2: 195,180
SQL\> select dump('Æ') from dual;
DUMP('Æ')
---------------------
Typ=96 Len=2: 195,134
Wie jetzt? Manchmal schon, manchmal nicht? Die Lösung ist der hier:
SQL\> select \* from nls\_database\_parameters
2 where parameter='NLS\_CHARACTERSET';
PARAMETER VALUE
------------------------------ -----------------------
NLS\_CHARACTERSET UTF8
Auf der ersten DB ist das Ergebnis des gleichen SELECTs:
PARAMETER VALUE
------------------------------ -----------------------
NLS\_CHARACTERSET WE8MSWIN1252
Gaaanz korrekt muss es also heißen: Es gibt bei bestimmten Charactersets einige (im Prinzip sind es eher viele, aber meist nur die bei uns eher ungebräuchlichen) Zeichen, die mehr als ein Byte verwenden. Das ganze Umfeld dazu ist übrigens meiner Ansicht nach die größte Schwäche von Oracle. Wenn’s jemanden interssiert schreibe ich gerne noch mehr dazu (ich brauche das ohnehin einmal im Halbjahr um meinen Ärger darüber loszuwerden), will euch ja nicht langweilen.
Liebe Grüße,
Martin