2014-06-09 13 views

Odpowiedz

5

Ponieważ używasz w składzie: charakter, należy uzyskać podstawową tablicę bajtów, a następnie uzyskać tę długość:

"Väste".getBytes(java.nio.charset.StandardCharsets.UTF_8).length 

wypisze 6

+4

Musisz określić kodowanie podczas używania getBytes() w przeciwnym razie getBytes() będzie zależało od domyślnego kodowania systemu. – dimoniy

9

Oracle podaje ci długość w bajtach, a "ä" ma 2 bajty w UTF-8 (c3 a4).

Więcej informacji here.

można uzyskać długość w bajtach użyciu str.getBytes("UTF-8").length

+0

"Jak więc uzyskać długość" wyroczni "?" – user2864740

+0

Oczywiście. Jak więc uzyskać długość "Oracle"? – markthegrea

0
public static int getByteSize(String content) { 
    int size = 0; 
    if (null != content) { 
     try { 
      size = content.getBytes("utf-8").length; 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
    } 
    return size; 
} 

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

8

Można, jak pokazali inni, przekonwertować ciąg znaków Java na tablicę bajtów przy użyciu zestawu znaków bazy danych Oracle, a następnie uzyskać w ten sposób długość w bajtach. Zależy to jednak od tego, jaki jest zestaw znaków twojej bazy danych - różne bazy danych będą miały różne zestawy znaków, co spowoduje różne długości bajtów dla tego samego ciągu znaków w różnych zestawach znaków.

Zakładając, że baza danych używa zestawu znaków o zmiennej szerokości, np. UTF-8 (NLS_CHARACTERSET z AL32UTF8), można również zadeklarować kolumny w Oracle na podstawie długości znaków, a nie długości bajtów. To może uprościć twój kod, ponieważ możesz po prostu sprawdzić długość znaków twojego łańcucha. Upraszcza również komunikację dla użytkowników. Zwykle trudno jest zrozumieć, dlaczego pole może czasami przechowywać 5 znaków, podczas gdy innym razem odrzuca ciąg 2 znaków w zależności od znaków, które są częścią ciągu (1 znak w zestawie znaków UTF-8 może wymagać do 3 bajtów składowy).

Domyślnie, gdy zadeklarujesz kolumnę

CREATE TABLE foo (
    col_name VARCHAR2(5) 
); 

który mówi Oracle pozwalają maksymalnie 5 bajtów danych. Jeśli chcesz, aby umożliwić 5 znaków danych niezależnie od liczby bajtów, jednak można użyć liczby znaków semantykę

CREATE TABLE foo (
    col_name VARCHAR2(5 CHAR) 
); 

Zakładając, że chcesz to zrobić dla wszystkich tabel podczas prowadzenia DDL, można także ustawić nls_length_semantics na poziomie sesji przed uruchomieniem swoją DDL

ALTER SESSION SET nls_length_semantics = CHAR; 

CREATE TABLE foo (
    col_name VARCHAR2(5) 
); 

tworzy tabelę z kolumną, która pozwala maksymalnie 5 znaków danych.

+0

Hi, Jak mogę uzyskać z rzeczywistego enkigowania kodu kolumny/tabeli? Nie jestem, jeśli mój kod działa na UTF-8 lub UTF-16 base – TNN

+0

@ TNN - 'v $ nls_parameters' powie ci bazę danych i narodową postać zestaw. Kolumny 'char',' varchar2' i 'clob' używają zestawu znaków bazy danych. Kolumny 'nchar',' nvarchar2' i 'nclob' używają narodowego zestawu znaków. Nie ma możliwości wyboru innego zestawu znaków dla konkretnej tabeli lub kolumny. –

+0

Dziękuję, to jest praca – TNN

Powiązane problemy