Oracle
 sql >> база данни >  >> RDS >> Oracle

Максималната дължина на VARCHAR е 4000, но може да се съхранява само 2666 байта дълъг тайландски текст

Проблемът

Когато описвате VARCHAR, трябва да предоставите единица, напр. VARCHAR2(200 BYTE) или VARCHAR2(200 CHAR) . Ако пропуснете единицата, по подразбиране е BYTE (вижте Концепции за бази данни на Oracle, глава Типове данни на Oracle ). Това изглежда като незначителен детайл, но става доста сериозно, когато имате многобайтови набори от знаци.

Ситуация до 11g

За съжаление има твърдо ограничение за максималния размер на колона VARCHAR2. Това е 4000 БАЙТА (!) (вижте Справочник за бази данни на Oracle, глава Типове данни на Oracle ) до Oracle 11g и . Това е твърда граница и няма начин да се заобиколи. Единственият начин за това е CLOB колона.

Решение за 12c

Ситуацията е различна при Oracle 12c. Там можете да използвате параметъра MAX_STRING_SIZE = EXTENDED за вдигане на ограничението до 32767 BYTEs (вижте Oracle Database Language Reference, глава Типове данни и Oracle Database Reference, глава Параметри за инициализация ). Така че очевидното решение е:Надстройте до Oracle 12c, задайте MAX_STRING_SIZE = EXTENDED според документацията и променете дефиницията на вашата таблица. Може да загубите някои индекси, когато променяте таблицата си, тъй като преди 12c не индексите не можеха да съдържат VARCHAR2 стойности с повече от 4000 BYTE и все още може да има известно ограничение. (Трябва да проверя проблема с индексите и дали може да бъде коригиран чрез повторно изграждане на индексите).

Решение:Променете кодирането на базата данни

Можете да опитате да промените собственото кодиране на вашата база данни (начина, по който вашата база данни преобразува CHAR в BYTE). За това обикновено трябва да създадете нова база данни и да предоставите подходящ параметър за NLS_CHARACTERSET. Това е много голяма промяна в начина, по който работи вашата база данни и може да има няколко странични ефекта. Ако някога се опитате да добавите знаци в различно кодиране, може да нямате късмет (т.е. не можете да ги съхраните във вашата база данни). Така че не бих предложил това решение.

Решение:Превключете към CLOB

Обикновено не е необходимо да се предоставят произволни заявки за толкова големи текстови полета. Може да опитате да идентифицирате заявките, избирайки в голямата текстова колона, и да ги мигрирате към Oracle Text на колона CLOB. Но това е много голяма промяна и може да не е възможно със съществуващата ви схема или вашето приложение. Може да се окажете с куп тригери „ВМЕСТО ОТ“ и с някои липсващи проверки на ограничения (включващи новосъздадената CLOB колона).

Решение:Използвайте XML

Вместо CLOB можете да опитате да съхраните своя низ като XML колона. Максималният размер за тях е 4 GB. Това ще навреди на ефективността ви, ще трябва да предоставите ВМЕСТО тригери и може да загубите някои ограничения, но може да работи за вас.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. oci_bind_by_name и to_date PHP/OCI/Oracle

  2. добавяне на първичен ключ към sql изглед

  3. извършване на изчисления върху данни в табличен тип

  4. Получаване на действителен план за изпълнение в Oracle 11g

  5. Стойността, вмъкната в таблицата в Oracle, не е запазена?