2012-12-10 2 views
7

SQL-Select-BefehlFirebird Standardzeichensatz

SELECT a.RDB$CHARACTER_SET_NAME FROM RDB$DATABASE a 

NULL zurück. Welcher Zeichensatz wird verwendet, wenn beim Erstellen einer neuen Datenbank keine angegeben wurde? Gibt es Unterschiede zwischen verschiedenen Versionen von Firebird (1.0, 2.0, 2.5.1 etc.)?

Antwort

13

Der Standardzeichensatz für eine Datenbank, wenn bei der Erstellung kein Zeichensatz angegeben wurde, ist der Zeichensatz NONE, siehe Seite 47 des Interbase 6.0 Data Definition Guide (verfügbar in der documentation section der Firebird-Website). Dies war seit Firebird (wahrscheinlich seit der Erstellung von Interbase) der Fall und gilt immer noch für die bestehenden Versionen. Wenn jedoch unter Firebird 2.5 eine Datenbank ohne Standardzeichensatz erstellt wird, hat RDB$CHARACTER_SET_NAME den Wert NONE. Ich bin mir nicht sicher, ob das in früheren Versionen anders war, meine Annahme wäre immer noch NONE als Standard, selbst wenn es NULL meldet.

Wenn Sie sicher sein wollen, können Sie einfach eine einfache Tabelle mit einem ohne Zeichensatz-Spezifikation CHAR oder VARCHAR Spalte erstellen, und verwenden Sie dann die folgende Abfrage den Standard zu bestimmen:

SELECT a.RDB$FIELD_NAME, a.RDB$RELATION_NAME, 
     b.RDB$CHARACTER_SET_ID, c.RDB$CHARACTER_SET_NAME 
FROM RDB$RELATION_FIELDS a 
INNER JOIN RDB$FIELDS b 
    ON b.RDB$FIELD_NAME = a.RDB$FIELD_SOURCE 
INNER JOIN RDB$CHARACTER_SETS c 
    ON c.RDB$CHARACTER_SET_ID = b.RDB$CHARACTER_SET_ID 
WHERE RDB$RELATION_NAME = 'TABLE_NAME' 

Sie können Verwenden Sie dies, um den Zeichensatz eines beliebigen Feldes ((VAR)CHAR) BTW zu finden.

Zeichensatz NONE bedeutet, dass keine Zeichensatzannahmen vorhanden sind, sodass Sie Daten in jedem Zeichensatz speichern können. Sie können jedoch nicht speichern oder vergleichen Sie es mit einer Spalte, die einen expliziten Zeichensatz (außer vielleicht Zeichensatz OCTETS, nicht sicher darüber). Wenn Sie NONE verwenden, müssen Sie sicherstellen, dass Sie immer denselben Verbindungszeichensatz verwenden, wenn Sie eine Verbindung zur Datenbank herstellen, oder wenn Sie den Zeichensatz NONE als Verbindungszeichensatz verwenden Sprache verwendet immer die gleiche Kodierung, sonst werden Sie Transliterationsprobleme (Zeichencodierungsprobleme) bekommen.

Die Verwendung von NONE als Verbindungszeichensatz hat zusätzliche Probleme. Zum Beispiel werden die Daten einer Spalte immer unverändert gesendet und als empfangen gespeichert, außer wenn eine Byte-Kombination im Zeichensatz der Spalte nicht erlaubt ist. Grundsätzlich bedeutet dies, dass die Datenbank in derselben Sprache verwendet werden muss, in der sie erstellt wurde.

Im Allgemeinen ist es besser, den Standardzeichensatz explizit anzugeben, es sei denn, Sie wissen, was Sie tun.