![]() |
Datenbank: firebird • Version: 2.5 • Zugriff über: Teoa Lib
Ändern von Character Set und Collate
ZeosLib 7.2.:-release
Hallo, Wie kann ich alte bestehende Firebird-Datenbänke 2.5 ohne Datenverlust verändern? Da die Iso8859_1 kein "€"-Zeichen speichern kann - hab ich echt ein Problem ..und das ist erst JETZT aufgefallen !!! Wie kann ich ALLE TABELLEN auf Character set UTF8 umstellen ( ich hab sicherlich hunderte CHARACTER SET ISO8859_1 COLLATE DE_DE Einträge) ??? Vielen Dank für Hilfe Erich Die Database Metadata schaut aktuell so aus:
Delphi-Quellcode:
SET SQL DIALECT 3;
/* CREATE DATABASE 'C:\test\database\DATABASE.FDB' PAGE_SIZE 4096 DEFAULT CHARACTER SET ISO8859_1 */ /* External Function declarations */ DECLARE EXTERNAL FUNCTION RDB$GET_CONTEXT VARCHAR(80) CHARACTER SET NONE, VARCHAR(80) CHARACTER SET NONE RETURNS VARCHAR(255) CHARACTER SET NONE FREE_IT ENTRY_POINT 'get_context' MODULE_NAME 'system_module'; DECLARE EXTERNAL FUNCTION RDB$SET_CONTEXT VARCHAR(80) CHARACTER SET NONE, VARCHAR(80) CHARACTER SET NONE, VARCHAR(255) CHARACTER SET NONE RETURNS INTEGER BY VALUE ENTRY_POINT 'set_context' MODULE_NAME 'system_module'; /* Table: ANHANG, Owner: SYSDBA */ CREATE TABLE "ANHANG" ( "INR" INTEGER NOT NULL, "USER_INR" INTEGER, "DATEINAME" CHAR(300) CHARACTER SET ISO8859_1 COLLATE DE_DE, "PFAD" CHAR(300) CHARACTER SET ISO8859_1 COLLATE DE_DE, CONSTRAINT "PK_ANHANG" PRIMARY KEY ("INR") ); .... .... Viele Tabellen .... /* Index definitions for all user tables */ CREATE INDEX "IDX_TEMP_ZUGRIFF_1" ON "TEMP_ZUGRIFF"("VORGANG"); .... .... Viele Indexe .... CREATE GENERATOR "POOL"; /* Grant Roles for this database */ /* Role: "RDB$ADMIN", Owner: SYSDBA */ CREATE ROLE "RDB$ADMIN"; /* Grant permissions for this database */ |
AW: Ändern von Character Set und Collate
Soweit ich weiß kann man eine Datenbank so einfach nicht ändern.
Ich benutze in solchen Fällen immer IBExpert, um mit "Extract Metadata" die Datenbank als Script zu exportieren. In dem Script dann noch Zeichensatz u. Collation ändern und dann neue Datenbank erzeugen. Ob das auch bei sehr großen Datenbanken funktioniert, kann ich nicht sagen. Geht glaube ich nur mit der gekauften Version von IBExpert. |
AW: Ändern von Character Set und Collate
Alternativ, die Daten per Programm (DataPump) von der alten in die neue Datenbank "schieben".
|
AW: Ändern von Character Set und Collate
Puhh ....
ich hab in der Zwischenzeit a bisserl rumgespielt und folgendes geschrieben ich starte bei einem OnClick in meinem Servicebereich: erstelle_felder('V_ENTSCH', 'EINTRAG', 200); erstelle_felder('ANTEILE', 'EINTRAG', 300); erstelle_felder('V_OVERVIEW', 'HTML_TEXT', 2000);
Delphi-Quellcode:
procedure TS_ADMIN.erstelle_felder(tabellenname, feldname: String; laenge: Integer);
var asql: String; begin // ---------------- 1.) try begin q1.SQL.Clear; q1.SQL.Append('SELECT "ZW_' + feldname + '" FROM ' + tabellenname + ''); q1.Open; // ---------------- 2.) q1.SQL.Clear; q1.SQL.Append('SELECT * FROM ' + tabellenname + ''); q1.Open; while not q1.eof do begin q1.edit; q1.FieldByName('ZW_' + feldname + '').AsVariant := q1.FieldByName(feldname).AsVariant; q1.post; q1.next; end; // ---------------- 3.) asql := 'ALTER TABLE "' + tabellenname + '" DROP "' + feldname + '" '; UniMainModule.ZConnection1.ExecuteDirect(asql); // ---------------- 4.) asql := 'ALTER TABLE "' + tabellenname + '" ALTER COLUMN "ZW_' + feldname + '" TO "' + feldname + '" '; UniMainModule.ZConnection1.ExecuteDirect(asql); mainform.showmessageA('Schritt 2: Die Feldwerte wurden kopiert - Zwischenspeicherfelder gelöscht - Feldnamen Wiederhergestellt - FERTIG !'); end; except begin asql := 'ALTER TABLE "' + tabellenname + '" add "ZW_' + feldname + '" CHAR(' + inttostr(laenge) + ') CHARACTER SET UTF8 '; UniMainModule.ZConnection1.ExecuteDirect(asql); mainform.showmessageA('Schritt 1: Die Zwischenspeicherfelder wurden erstellt - Starten sie NOCHMAL die Funktion'); end; end; end;
Code:
Wenn ich folgendes HÄTTE :-) wäre es cool:
Schleife A Gehe alle Tabellen einer Datenbank durch Schleife B Gehe alle Felder einer Tabelle durch IF Feld ist "CHARACTER SET ISO8859_1 COLLATE DE_DE" ODER "CHARACTER SET ISO8859_1" then begin x = Laenge vom Feld erstelle_felder(aktueller Tabellenname, aktuelles Tabellenfeld, x); end end end |
AW: Ändern von Character Set und Collate
Zitat:
Es sei denn, du willst ein "€"-Zeichen in einem Feld- oder Tabellen-Namen verwenden... Wir verwenden generell keine Sonderzeichen in Metadaten-Bezeichnern. Alex |
AW: Ändern von Character Set und Collate
Zitat:
Achja, und ISO8859-1 enthält kein Eurozeichen. Man kann aber programmseitig eins ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 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-2025 by Thomas Breitkreuz