Unterschied zwischen VARCHAR2 (10 CHAR) und NVARCHAR2 (10)
Habe ich installiert Oracle Database 10g Express Edition (Universal) mit den Standard-Einstellungen:
SELECT * FROM NLS_DATABASE_PARAMETERS;
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16
Gegeben, dass beide CHAR
und NCHAR
Datentypen scheinen zu akzeptieren, multi-byte-strings, was ist der genaue Unterschied zwischen diesen zwei Spalten-Definitionen?
VARCHAR2(10 CHAR)
NVARCHAR2(10)
InformationsquelleAutor der Frage | 2010-12-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den NVARCHAR2 Datentyp wurde von Oracle-Datenbanken, die wollen, um die Verwendung von Unicode für einige Spalten, während ein anderer Zeichensatz für den rest der Datenbank (die verwendet VARCHAR2). Die NVARCHAR2 ist nur-Unicode-Datentyp.
Einem Grund, den Sie verwenden möchten, können NVARCHAR2 könnte sein, dass dein DB verwendet eine nicht-Unicode-Zeichensatz und Sie wollen immer noch in der Lage, zum speichern von Unicode-Daten für einige Spalten ohne änderung der primären Zeichensatz. Ein weiterer Grund könnte sein, dass Sie verwenden wollen, zwei Zeichensatzes Unicode (AL32UTF8 für Daten, kommt meist aus West-Europa, AL16UTF16 für Daten, kommt meist aus Asien zum Beispiel), weil verschiedene Zeichensätze nicht speichern die gleichen Daten gleichermaßen effizient.
Beide Spalten in deinem Beispiel (Unicode
VARCHAR2(10 CHAR)
undNVARCHAR2(10)
) wäre in der Lage, zum speichern der gleichen Daten, jedoch ist die byte-Speicher wird anders sein. Möglicherweise einige Zeichenfolgen gespeichert werden effizienter in die eine oder andere.Beachten Sie auch, dass einige features funktionieren nicht mit NVARCHAR2, sehen dies SO Frage:
InformationsquelleAutor der Antwort Vincent Malgrat
nVarchar2 ist ein Unicode-nur Speicher.
Obwohl beide Datentypen variabler Länge String-Datentypen können Sie den Unterschied bemerken, wie Sie Werte speichern.
Jedes Zeichen wird gespeichert in bytes. Wie wir wissen, nicht in allen Sprachen Alphabete mit gleichen Länge, zB, Englisch alphabet benötigt 1 byte pro Zeichen, jedoch Sprachen wie Japanisch oder Chinesisch, benötigen mehr als 1 byte für die Speicherung eines Zeichens.
Wenn Sie angeben, varchar2(10), Sie sagen, die DB, dass nur 10 bytes von Daten gespeichert werden. Aber, wenn Sie sagen, nVarchar2(10), es bedeutet 10 Zeichen gespeichert werden. In diesem Fall, Sie müssen nicht sorgen zu machen über die Anzahl der bytes, die von jeder Charakter nimmt.
InformationsquelleAutor der Antwort Pooja
Frage mich ob NVARCHAR2(1) und VARCHAR2(1) anders handeln in Bezug auf null /leer Wert?
Testen, scheint der gleiche ..
Einige überraschungen
D. H. durch Vergleich leerer string != "Y" wird nicht leerer string zurückgegeben Zeilen ..
d.h. Leere Zeichenfolge weder macht noch nicht gleich mit 'Y' ...
müssen nvl-wrapper-Funktion
z.B.
und nvl(upper(WP."OW_IS_MISRUN"),'N') != 'Y'
wählen
count(*)
aus
"DATA_HUB"."OW_WELL_PERFORATION" WP
wo
WP.UWI = 17038046
7
select count(*)
aus
"DATA_HUB"."OW_WELL_PERFORATION" WP
wo
WP.UWI = 17038046
und oberen(WP."OW_IS_MISRUN") != 'Y'
1
select count(*)
aus
"DATA_HUB"."OW_WELL_PERFORATION" WP
wo
WP.UWI = 17038046
und oberen(WP."OW_IS_MISRUN") = 'Y'
2
select count(*)
aus
"DATA_HUB"."OW_WELL_PERFORATION" WP
wo
WP.UWI = 17038046
und nvl(upper(WP."OW_IS_MISRUN"),'N') != 'Y'
5
InformationsquelleAutor der Antwort Allan F