Wahre Länge eines Strings, wie von Oracle gesehen

8

Ich versuche also, Daten in einer Oracle-Datenbank zu speichern. Ich habe eine Zeichenfolge:

%Vor%

(der Name eines Staates irgendwo).

Wenn ich eine .length () -Angabe mache, bekomme ich 5, aber wenn ich es in der Datenbank speichere, bekomme ich:

%Vor%

Wie bekomme ich die "Orakel" -Länge?

    
markthegrea 09.06.2014, 18:50
quelle

4 Antworten

5

Da Sie ein zusammengesetztes Zeichen verwenden, sollten Sie das zugrunde liegende Byte-Array abrufen und dann die Länge erhalten:

%Vor%

wird 6 ausdrucken.

    
Jeroen Vannevel 09.06.2014, 18:54
quelle
9

Oracle gibt Ihnen die Länge in Bytes und "ä" ist 2 Bytes in UTF-8 (c3 a4).

Weitere Informationen hier .

Sie können die Länge in Bytes mit str.getBytes("UTF-8").length

erhalten     
Denys Séguret 09.06.2014 18:52
quelle
8

Sie können, wie andere gezeigt haben, die Java-Zeichenkette unter Verwendung des Zeichensatzes der Oracle-Datenbank in ein Byte-Array konvertieren und dann die Länge in Bytes erhalten. Das hängt jedoch davon ab, zu wissen, wie der Zeichensatz Ihrer Datenbank ist - verschiedene Datenbanken haben unterschiedliche Zeichensätze, was zu unterschiedlichen Byte-Längen für die gleiche Zeichenkette in verschiedenen Zeichensätzen führt.

Angenommen, Ihre Datenbank verwendet einen Zeichensatz mit variabler Breite wie UTF-8 ( NLS_CHARACTERSET von AL32UTF8), können Sie auch Spalten in Oracle auf der Grundlage der Zeichenlänge statt der Byte-Länge deklarieren. Das kann Ihren Code vereinfachen, da Sie einfach die Zeichenlänge Ihrer Zeichenfolge überprüfen können. Es vereinfacht auch die Kommunikation für Benutzer. Es ist im Allgemeinen schwierig für Benutzer zu verstehen, warum ein Feld manchmal 5 Zeichen speichern kann, während es manchmal eine 2-Zeichen-Zeichenfolge ablehnt, abhängig von den Zeichen, die Teil der Zeichenfolge sind (1 Zeichen im UTF-8-Zeichensatz kann bis zu 3 Byte erfordern) der Lagerung).

Standardmäßig, wenn Sie eine Spalte deklarieren

%Vor%

, das Oracle anweist, bis zu 5 Datenbytes zuzulassen. Wenn Sie jedoch 5 Zeichen von Daten unabhängig von der Anzahl der Bytes zulassen möchten, können Sie die Semantik der Zeichenlänge verwenden

%Vor%

Angenommen, Sie möchten dies für alle Ihre Tabellen ausführen, während Sie Ihre DDL ausführen, können Sie auch nls_length_semantics auf Sitzungsebene festlegen, bevor Sie Ihre DDL ausführen

%Vor%

erstellt eine Tabelle mit einer Spalte, die bis zu 5 Zeichen Daten erlaubt.

    
Justin Cave 09.06.2014 19:22
quelle
0
%Vor%

System.out.println (getByteSize ("Väste")); // 6 System.out.println (getByteSize ("Väää")); // 7

    
user2942579 09.06.2014 19:05
quelle

Tags und Links