Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi warum definierte varchar-größe egal? (https://www.delphipraxis.net/66325-warum-definierte-varchar-groesse-egal.html)

sancho1980 28. Mär 2006 16:12

Datenbank: interbase • Version: 6.5 • Zugriff über: ibx, ibexpert

warum definierte varchar-größe egal?
 
hallo,
ich hab mal eine frage:
ich arbeite an einer delphi-anwendung, welche auf eine interbase-datenbank zugreift.
nun gibt es in dieser datenbank eine domain varchar_80 definiert mit varchar(80)
der zeichensatz ist unicode_fss und ich benutze für die darstellung der datenbankfelder in delphi die unicode-fähigen tnt-controls
mir ist aufgefallen, dass es trotzdem möglich ist, in diese felder strings mit mehr(!!) als 80 zeichen zu speichern
wie kommt das?

mkinzler 28. Mär 2006 16:22

Re: warum definierte varchar-größe egal?
 
Die Beschränkung gilt nur in der Datenbank. In der Datenbank werden die Strings dann aber auf 80 gekürzt. Wenn du verhindern willst, daß "zu lange" Strings eingegeben werden mußt du im Eingabecontrol verhindern.

sancho1980 28. Mär 2006 16:30

Re: warum definierte varchar-größe egal?
 
genau das ist das eigenartige:
wenn ich den string poste und die datenbank schließe und wieder öffne ist er immer noch genauso lang!!!
meine vermutung war, dass es irgendwie mit der unicode-geschichte zusammenhängt...aber wie?!?!

mkinzler 28. Mär 2006 16:35

Re: warum definierte varchar-größe egal?
 
Du kannst in ein Datenbankfeld welches 80 Zeichen lang ist mehr als 80 Zeichen einfügen?

sancho1980 28. Mär 2006 16:36

Re: warum definierte varchar-größe egal?
 
genau das meine ich

mkinzler 28. Mär 2006 16:44

Re: warum definierte varchar-größe egal?
 
Zitat:

meine vermutung war, dass es irgendwie mit der unicode-geschichte zusammenhängt...aber wie?!?!
Unicode heißt ja eigentlich nur das pro Zeichen mehr als 8 Bit zur Verfügung stehen.

Ich habe mal zum test im IBExpert eine FB Daten mit einem Varchar Feld mit Zeichensatz unicode_fss angelegt. Hier werden nur die beschränkte Menge angenommen.

sancho1980 28. Mär 2006 16:49

Re: warum definierte varchar-größe egal?
 
kennst du die tnt-controls für delphi?
scheint irgendwas mit der übersetzung nicht ganz zu funktionieren?

mkinzler 28. Mär 2006 16:51

Re: warum definierte varchar-größe egal?
 
Kannst du im IBExpert auch längere Zeichenketten eingeben?
Delphi-Quellcode:
scheint irgendwas mit der übersetzung nicht ganz zu funktionieren?
Du meinst dass er mehrere (ASCII-)Zeichen in eine Unicodezeichen schreibt?

sancho1980 28. Mär 2006 16:55

Re: warum definierte varchar-größe egal?
 
so ungefähr
aber eigentlich sind die tnt-controls ja unicode-fähig

NormanNG 28. Mär 2006 18:03

Re: warum definierte varchar-größe egal?
 
Hi,

Zitat:

Zitat von sancho1980
genau das ist das eigenartige:
wenn ich den string poste und die datenbank schließe und wieder öffne ist er immer noch genauso lang!!!
meine vermutung war, dass es irgendwie mit der unicode-geschichte zusammenhängt...aber wie?!?!

kann es sein, dass der Wert "einfach noch drin" steht? Oder beendest du dein Programm, startest neu und hast wieder den kompletten String? Würde mich allerdings sehr wundern!

sancho1980 28. Mär 2006 18:23

Re: warum definierte varchar-größe egal?
 
genau das mein ich und damit du mir glaubst füg ich die anwendung mal bei: die datenbank ist auch enthalten (demodeen.gdb)
starte die anwendung und geh auf öffnen-wörterbuch und dann wähle die datenbank aus
du kannst problemlos einen begriff mit mehr als 80 zeichen eingeben und abspeichern obwohl die domain auf 80 zeichen beschränkt ist!
(einfach metadaten mit ibexpert mal anschauen!)

mkinzler 28. Mär 2006 18:31

Re: warum definierte varchar-größe egal?
 
Hallo sancho1980,

könntest du die Datenbank auch als Skript einstellen, bei mir ist nur FB installiert und der kann mit IB6.5 Datenbanken nichts anfabgen.

Danke.

sancho1980 28. Mär 2006 18:40

Re: warum definierte varchar-größe egal?
 
kein thema:

SQL-Code:
/******************************************************************************/
/****         Generated by IBExpert 2006.01.29 28.03.2006 18:39:58         ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES UNICODE_FSS;

CREATE DATABASE 'C:\Dokumente und Einstellungen\Sancho\Eigene Dateien\DEMODEEN.GDB'
USER 'sysdba' PASSWORD 'masterkey'
PAGE_SIZE 4096
DEFAULT CHARACTER SET UNICODE_FSS;



/******************************************************************************/
/****                               Domains                               ****/
/******************************************************************************/

CREATE DOMAIN MEMOBLOB AS
BLOB SUB_TYPE 1 SEGMENT SIZE 4096;

CREATE DOMAIN VARCHAR_1 AS
VARCHAR(1);

CREATE DOMAIN VARCHAR_10 AS
VARCHAR(10);

CREATE DOMAIN VARCHAR_100 AS
VARCHAR(100);

CREATE DOMAIN VARCHAR_14 AS
VARCHAR(10);

CREATE DOMAIN VARCHAR_15 AS
VARCHAR(15);

CREATE DOMAIN VARCHAR_20 AS
VARCHAR(20);

CREATE DOMAIN VARCHAR_3 AS
VARCHAR(10);

CREATE DOMAIN VARCHAR_4 AS
VARCHAR(4);

CREATE DOMAIN VARCHAR_40 AS
VARCHAR(40);

CREATE DOMAIN VARCHAR_50 AS
VARCHAR(50);

CREATE DOMAIN VARCHAR_60 AS
VARCHAR(60);

CREATE DOMAIN VARCHAR_80 AS
VARCHAR(80);



/******************************************************************************/
/****                              Generators                             ****/
/******************************************************************************/

CREATE GENERATOR GEN_AUT_ID;
SET GENERATOR GEN_AUT_ID TO 12;

CREATE GENERATOR GEN_DICENTRIES_ID;
SET GENERATOR GEN_DICENTRIES_ID TO 244;

CREATE GENERATOR GEN_DSKRPTLINK_DICENTRIES_ID;
SET GENERATOR GEN_DSKRPTLINK_DICENTRIES_ID TO 101;

CREATE GENERATOR GEN_DSKRPTLINK_D_LIT_ID;
SET GENERATOR GEN_DSKRPTLINK_D_LIT_ID TO 21;

CREATE GENERATOR GEN_DSKRPTS_ID;
SET GENERATOR GEN_DSKRPTS_ID TO 36;

CREATE GENERATOR GEN_D_LIT_ID;
SET GENERATOR GEN_D_LIT_ID TO 18;

CREATE GENERATOR GEN_LIT_ID;
SET GENERATOR GEN_LIT_ID TO 16;

CREATE GENERATOR GEN_TITELAUFS_LIT_ID;
SET GENERATOR GEN_TITELAUFS_LIT_ID TO 6;

CREATE GENERATOR GEN_TITELWERK_LIT_ID;
SET GENERATOR GEN_TITELWERK_LIT_ID TO 12;



/******************************************************************************/
/****                                Tables                               ****/
/******************************************************************************/



CREATE TABLE AUT (
    ID       INTEGER NOT NULL,
    AUT      VARCHAR_3,
    VF       VARCHAR_50,
    FUNKTION VARCHAR_50,
    FIRMA1    VARCHAR_50,
    FIRMA2    VARCHAR_50,
    STRASSE  VARCHAR_40,
    PLZ      VARCHAR_10,
    ORT      VARCHAR_40,
    LAND     VARCHAR_20,
    TEL      VARCHAR_20,
    TELPRIV  VARCHAR_20,
    FAX      VARCHAR_20,
    ANM      VARCHAR_80,
    DATUM    DATE,
    TYP      VARCHAR_1
);

CREATE TABLE D_LIT (
    ID     INTEGER NOT NULL,
    ID_LIT SMALLINT NOT NULL
);

CREATE TABLE DICENTRIES (
    ID          INTEGER NOT NULL,
    ASTERM      VARCHAR_80,
    ASABK       VARCHAR_10,
    ASPRGM      VARCHAR_20,
    ASSEM       VARCHAR_80,
    ZSTERM      VARCHAR_80,
    ZSABK       VARCHAR_10,
    ZSPRGM      VARCHAR_20,
    ZSSEM       VARCHAR_80,
    DATUM       DATE,
    PROJ        VARCHAR_20,
    REV         VARCHAR_1,
    UPDDATUM    DATE,
    ASVERW      INTEGER,
    ZSVERW      INTEGER,
    ASDEF       MEMOBLOB,
    ZSDEF       MEMOBLOB,
    ASAUDIO     VARCHAR_20,
    ASVIDEO     VARCHAR_20,
    ASABBILDUNG VARCHAR_20,
    ASQCODE     INTEGER,
    ZSQCODE     INTEGER,
    AUT         INTEGER,
    UPDAUT      INTEGER,
    ZSABBILDUNG VARCHAR_20,
    ZSAUDIO     VARCHAR_20,
    ZSVIDEO     VARCHAR_20
);

CREATE TABLE DSKRPTLINK_D_LIT (
    ID        INTEGER NOT NULL,
    ID_D_LIT  INTEGER NOT NULL,
    ID_DSKRPT SMALLINT NOT NULL
);

CREATE TABLE DSKRPTLINK_DICENTRIES (
    ID_DICENTRY INTEGER NOT NULL,
    ID_DSKRPT   INTEGER NOT NULL,
    ID          INTEGER NOT NULL
);

CREATE TABLE DSKRPTS (
    ASDSKRPT VARCHAR_10 NOT NULL,
    ZSDSKRPT VARCHAR_10 NOT NULL,
    ASLANG   VARCHAR_50,
    ZSLANG   VARCHAR_50,
    ID       INTEGER NOT NULL
);

CREATE TABLE LIT (
    ID       INTEGER NOT NULL,
    VF       VARCHAR_50,
    HRSG     VARCHAR_50,
    ORT      VARCHAR_20,
    VERLAG   VARCHAR_20,
    BANDHEFT VARCHAR_3,
    JAHR     VARCHAR_4,
    SEITE    VARCHAR_10,
    PREIS    VARCHAR_10,
    ISBN     VARCHAR_14,
    STANDNR  VARCHAR_20,
    ANM1      VARCHAR_60,
    ANM2      VARCHAR_60,
    AUT      INTEGER,
    DATUM    DATE,
    TYP      VARCHAR_3,
    SPRACHEN VARCHAR_20,
    QCODE    VARCHAR_15
);

CREATE TABLE TITELAUFS_LIT (
    ID        INTEGER NOT NULL,
    TITELAUFS VARCHAR_60 NOT NULL,
    LIT_ID    INTEGER NOT NULL
);

CREATE TABLE TITELWERK_LIT (
    ID        INTEGER NOT NULL,
    TITELWERK VARCHAR_60 NOT NULL,
    ID_LIT    INTEGER NOT NULL
);



/******************************************************************************/
/****                          Unique Constraints                         ****/
/******************************************************************************/

ALTER TABLE DSKRPTS ADD CONSTRAINT UNQ_DSKRPTS UNIQUE (ASDSKRPT, ZSDSKRPT);


/******************************************************************************/
/****                             Primary Keys                            ****/
/******************************************************************************/

ALTER TABLE AUT ADD CONSTRAINT PK_AUT PRIMARY KEY (ID);
ALTER TABLE DICENTRIES ADD PRIMARY KEY (ID);
ALTER TABLE DSKRPTLINK_DICENTRIES ADD PRIMARY KEY (ID);
ALTER TABLE DSKRPTLINK_D_LIT ADD CONSTRAINT PK_DSKRPTLINK_D_LIT PRIMARY KEY (ID);
ALTER TABLE DSKRPTS ADD PRIMARY KEY (ID);
ALTER TABLE D_LIT ADD CONSTRAINT PK_D_LIT PRIMARY KEY (ID);
ALTER TABLE LIT ADD CONSTRAINT PK_LIT PRIMARY KEY (ID);
ALTER TABLE TITELAUFS_LIT ADD CONSTRAINT PK_TITELAUFS_LIT PRIMARY KEY (ID);
ALTER TABLE TITELWERK_LIT ADD CONSTRAINT PK_TITELWERK_LIT PRIMARY KEY (ID);


/******************************************************************************/
/****                             Foreign Keys                            ****/
/******************************************************************************/

ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_1 FOREIGN KEY (ASVERW) REFERENCES DICENTRIES (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_2 FOREIGN KEY (ZSVERW) REFERENCES DICENTRIES (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_3 FOREIGN KEY (ASQCODE) REFERENCES LIT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_4 FOREIGN KEY (ZSQCODE) REFERENCES LIT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_5 FOREIGN KEY (AUT) REFERENCES AUT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DICENTRIES ADD CONSTRAINT FK_DICENTRIES_6 FOREIGN KEY (UPDAUT) REFERENCES AUT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DSKRPTLINK_DICENTRIES ADD CONSTRAINT FK_DSKRPTLINK_DICENTRIES_1 FOREIGN KEY (ID_DICENTRY) REFERENCES DICENTRIES (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DSKRPTLINK_DICENTRIES ADD CONSTRAINT FK_DSKRPTLINK_DICENTRIES_2 FOREIGN KEY (ID_DSKRPT) REFERENCES DSKRPTS (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DSKRPTLINK_D_LIT ADD CONSTRAINT FK_DSKRPTLINK_D_LIT_1 FOREIGN KEY (ID_D_LIT) REFERENCES D_LIT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DSKRPTLINK_D_LIT ADD CONSTRAINT FK_DSKRPTLINK_D_LIT_2 FOREIGN KEY (ID_DSKRPT) REFERENCES DSKRPTS (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE D_LIT ADD CONSTRAINT FK_D_LIT_1 FOREIGN KEY (ID_LIT) REFERENCES LIT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE TITELAUFS_LIT ADD CONSTRAINT FK_TITELAUFS_LIT_1 FOREIGN KEY (LIT_ID) REFERENCES LIT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE TITELWERK_LIT ADD CONSTRAINT FK_TITELWERK_LIT_1 FOREIGN KEY (ID_LIT) REFERENCES LIT (ID) ON DELETE CASCADE ON UPDATE CASCADE;


/******************************************************************************/
/****                               Indices                               ****/
/******************************************************************************/

CREATE UNIQUE INDEX AUT_IDX1 ON AUT (AUT);
CREATE INDEX AUT_IDX2 ON AUT (FIRMA1);
CREATE INDEX AUT_IDX3 ON AUT (FIRMA2);
CREATE INDEX AUT_IDX4 ON AUT (ORT);
CREATE INDEX AUT_IDX5 ON AUT (PLZ);
CREATE INDEX AUT_IDX6 ON AUT (TYP);
CREATE INDEX AUT_IDX7 ON AUT (VF);
CREATE INDEX DICENTRIES_IDX1 ON DICENTRIES (ASABK);
CREATE INDEX DICENTRIES_IDX10 ON DICENTRIES (ZSQCODE);
CREATE INDEX DICENTRIES_IDX11 ON DICENTRIES (ZSTERM);
CREATE INDEX DICENTRIES_IDX2 ON DICENTRIES (ASTERM);
CREATE INDEX DICENTRIES_IDX3 ON DICENTRIES (DATUM);
CREATE INDEX DICENTRIES_IDX4 ON DICENTRIES (PROJ);
CREATE INDEX DICENTRIES_IDX5 ON DICENTRIES (REV);
CREATE INDEX DICENTRIES_IDX6 ON DICENTRIES (AUT);
CREATE INDEX DICENTRIES_IDX7 ON DICENTRIES (UPDAUT);
CREATE INDEX DICENTRIES_IDX8 ON DICENTRIES (UPDDATUM);
CREATE INDEX DICENTRIES_IDX9 ON DICENTRIES (ZSABK);
CREATE INDEX GEN_DSKRPTLINK_DICENTRIES_IDX1 ON DSKRPTLINK_DICENTRIES (ID_DICENTRY);
CREATE INDEX GEN_DSKRPTLINK_DICENTRIES_IDX2 ON DSKRPTLINK_DICENTRIES (ID_DSKRPT);
CREATE UNIQUE INDEX DSKRPTS_IDX1 ON DSKRPTS (ASDSKRPT);
CREATE UNIQUE INDEX DSKRPTS_IDX2 ON DSKRPTS (ZSDSKRPT);
CREATE INDEX LIT_IDX10 ON LIT (VERLAG);
CREATE INDEX LIT_IDX6 ON LIT (HRSG);
CREATE INDEX LIT_IDX7 ON LIT (QCODE);
CREATE INDEX LIT_IDX8 ON LIT (TYP);
CREATE INDEX LIT_IDX9 ON LIT (VF);


/******************************************************************************/
/****                               Triggers                              ****/
/******************************************************************************/


SET TERM ^ ;


/******************************************************************************/
/****                         Triggers for tables                         ****/
/******************************************************************************/



/* Trigger: AUT_BI0 */
CREATE TRIGGER AUT_BI0 FOR AUT
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  new.ID = gen_id(gen_aut_id,1);
end
^

/* Trigger: DICENTRIES_BI0 */
CREATE TRIGGER DICENTRIES_BI0 FOR DICENTRIES
ACTIVE BEFORE INSERT POSITION 0
as
begin
  new.ID = gen_id(gen_dicentries_id,1);
end
^

/* Trigger: DSKRPTLINK_DICENTRIES_BI0 */
CREATE TRIGGER DSKRPTLINK_DICENTRIES_BI0 FOR DSKRPTLINK_DICENTRIES
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  new.ID = gen_id(GEN_DSKRPTLINK_DICENTRIES_ID,1);
end
^

/* Trigger: DSKRPTLINK_D_LIT_BI0 */
CREATE TRIGGER DSKRPTLINK_D_LIT_BI0 FOR DSKRPTLINK_D_LIT
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  new.ID = gen_id(GEN_DSKRPTLINK_D_LIT_ID,1);
end
^

/* Trigger: DSKRPTS_BI0 */
CREATE TRIGGER DSKRPTS_BI0 FOR DSKRPTS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  new.ID = gen_id(gen_dskrpts_id,1);
end
^

/* Trigger: D_LIT_BI0 */
CREATE TRIGGER D_LIT_BI0 FOR D_LIT
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  new.ID = gen_id(GEN_D_LIT_ID,1);
end
^

/* Trigger: LIT_BI0 */
CREATE TRIGGER LIT_BI0 FOR LIT
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  new.ID = gen_id(gen_lit_id,1);
end
^

/* Trigger: TITELAUFS_LIT_BI0 */
CREATE TRIGGER TITELAUFS_LIT_BI0 FOR TITELAUFS_LIT
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  new.ID = gen_id(gen_titelaufs_lit_id,1);
end
^

/* Trigger: TITELWERK_LIT_BI0 */
CREATE TRIGGER TITELWERK_LIT_BI0 FOR TITELWERK_LIT
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  new.ID = gen_id(gen_titelwerk_lit_id,1);
end
^

SET TERM ; ^


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz