Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Maksymalna długość VARCHAR to 4000, ale można zapisać tylko 2666 bajtowy tekst w języku tajskim

Problem

Opisując VARCHAR należy podać jednostkę, np. VARCHAR2(200 BYTE) lub VARCHAR2(200 CHAR) . Jeśli pominiesz jednostkę, domyślnie jest to BYTE (patrz Oracle Database Concepts, rozdział Typy danych Oracle ). Wydaje się to być drobnym szczegółem, ale staje się dość poważne, gdy masz wielobajtowe zestawy znaków.

Sytuacja do 11 g

Niestety istnieje sztywne ograniczenie maksymalnego rozmiaru kolumny VARCHAR2. Jest to 4000 BYTEs (!) (patrz Oracle Database Reference, rozdział Typy danych Oracle ) do Oracle 11g i . To jest sztywny limit i nie da się tego obejść. Jedynym sposobem na obejście tego jest kolumna CLOB.

Rozwiązanie dla 12c

Inaczej sytuacja wygląda na Oracle 12c. Tam możesz użyć parametru MAX_STRING_SIZE = EXTENDED aby podnieść limit do 32767 bajtów (patrz Oracle Database Language Reference, rozdział Typy danych oraz Oracle Database Reference, rozdział Parametry inicjalizacji ). Oczywistym rozwiązaniem jest więc:Uaktualnij do Oracle 12c, ustaw MAX_STRING_SIZE = EXTENDED zgodnie z dokumentacją i zmień definicję tabeli. Możesz stracić niektóre indeksy podczas zmiany tabeli, ponieważ wcześniej do 12c nie indeksy nie mogły przechowywać wartości VARCHAR2 z więcej niż 4000 BYTEs i nadal mogą istnieć pewne ograniczenia. (Muszę sprawdzić problem z indeksami i czy można go naprawić, przebudowując indeksy).

Rozwiązanie:Zmień kodowanie bazy danych

Możesz spróbować zmienić natywne kodowanie bazy danych (sposób, w jaki Twoja baza danych mapuje CHAR na BYTE). W tym celu zwykle musisz utworzyć nową bazę danych i podać odpowiedni parametr dla NLS_CHARACTERSET. Jest to bardzo duża zmiana w sposobie działania Twojej bazy danych i może mieć kilka skutków ubocznych. Jeśli kiedykolwiek spróbujesz dodać znaki w innym kodowaniu, możesz mieć pecha (tzn. nie możesz ich przechowywać w swojej bazie danych). Więc nie sugerowałbym tego rozwiązania.

Rozwiązanie:Przełącz na CLOB

Zazwyczaj nie jest konieczne zadawanie dowolnych zapytań na tak dużych polach tekstowych. Możesz spróbować zidentyfikować zapytania wybierane w kolumnie z dużym tekstem i przenieść je do Oracle Text w kolumnie CLOB. Jest to jednak bardzo duża zmiana, która może nie być możliwa w przypadku istniejącego schematu lub aplikacji. Możesz skończyć z kilkoma wyzwalaczami „ZAMIAST” i kilkoma brakującymi kontrolami ograniczeń (z udziałem nowo utworzonej kolumny CLOB).

Rozwiązanie:użyj XML

Zamiast CLOB możesz spróbować przechowywać swój ciąg jako kolumnę XML. Maksymalny rozmiar dla nich to 4 GB. Zaszkodzi to twojej wydajności, będziesz musiał zapewnić wyzwalacze ZAMIAST i możesz stracić pewne ograniczenia, ale może to zadziałać dla ciebie.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wiele partycji na stole?

  2. Błąd Podczas łączenia się z Oracle, TNS:listener nie wie aktualnie o żądanej usłudze w deskryptorze połączenia

  3. Oblicz odległość między dwoma punktami łat long w Oracle

  4. Błąd SSMA dla Oracle Connect to Oracle

  5. Usuń zduplikowane wiersze w Oracle SQL, pozostawiając najnowsze wpisy