Jeśli nie interesuje Cię tylko maksymalna zmiana, Twój przykład nie jest poprawny.
AL32UTF8 to zestaw znaków o zmiennej długości. Mówiąc ogólnie, każdy znak z zestawu znaków US7ASCII zajmuje 1 bajt, znaki europejskie zazwyczaj wymagają 2 bajtów, różne znaki języka azjatyckiego wymagają 3 bajtów, a kilka bardzo rzadkich znaków wymaga 4 bajtów. Realistycznie rzecz biorąc, jeśli mówisz o konwersji rzeczywistych danych WE8ISO8859P1 na AL32UTF8, w praktyce zobaczysz współczynnik konwersji między 1 a 2, który jest znacznie bliższy 1 niż 2. Bez wyszukiwania mapowania Unicode dla każdego prawidłowego znaku WE8ISO8859P1 , byłbym zaskoczony, gdyby w zestawie znaków AL32UTF8 wymagane były 3 lub 4 bajty pamięci.
W Przewodniku wsparcia globalizacji znajduje się sekcja dotycząca zestawy znaków to mówi, które zestawy znaków są jednobajtowe, które są wielobajtowe, a które wielobajtowe mają stałą szerokość. Prawie wszystkie wielobajtowe zestawy znaków mają zmienną szerokość, więc czynnik, którego szukasz, będzie zależał od Twoich danych.
W większości przypadków lepiej jest zadeklarować, że kolumny będą używać semantyki długości znakowej, a nie semantyki długości bajtowej, pozwalając bazie danych zorientować się za kulisami, ile danych ma zaalokować. Na przykład, jeśli zadeklarujesz kolumnę
CREATE TABLE foo (
col1 VARCHAR2(10 CHAR)
)
Oracle przydzieli miejsce na 10 znaków pamięci niezależnie od zestawu znaków bazy danych i bez względu na rzeczywistą liczbę bajtów wymaganych do przechowywania tych danych (z zastrzeżeniem limitu 4000 bajtów na VARCHAR2
kolumna). To generalnie znacznie ułatwia definiowanie rozmiarów kolumn ponieważ nie musisz przewymiarowywaćkolumn w przypadku gdy ktoś zdecyduje się wrzucić 10 4-bajtowych znaków UTF-8 do jednego wiersza i nie musisz wyjaśniaćużytkownikomże kolumna zaakceptuje ciągi o różnej liczbie znaków w zależności od wybranego języka i/lub określonych znaków.
Chociaż ludzie z Oracle, którzy regularnie zajmują się globalizacją, odradzają to , preferując jawne określenie semantyki długości znaków podczas deklarowania kolumn lub przynajmniej ustawianie jej tylko na poziomie sesji, możesz ustawić NLS_LENGTH_SEMANTICS
parametr inicjalizacji
spowodować VARCHAR2(10)
aby domyślnie używać semantyki długości znaków zamiast semantyki długości bajtów (nadal możesz określić VARCHAR2(10 BYTE)
jeśli chcesz semantyki długości bajtów).