sql >> Databasteknik >  >> RDS >> Oracle

VARCHAR maxlängd är 4000 men endast 2666 byte lång thailändsk text kan lagras

Problemet

När du beskriver en VARCHAR bör du tillhandahålla en enhet, t.ex. VARCHAR2(200 BYTE) eller VARCHAR2(200 CHAR) . Om du utelämnar enheten är standardinställningen BYTE (se Oracle Database Concepts, kapitel Oracle-datatyper a> ). Detta verkar vara en liten detalj, men blir ganska allvarlig när du har flera byte teckenuppsättningar.

Situation upp till 11g

Tyvärr finns det en hård gräns för den maximala storleken på en VARCHAR2-kolumn. Det är 4000 BYTE (!) (se Oracle Database Reference, kapitel Oracle-datatyper ) upp till Oracle 11g och . Detta är en hård gräns och det finns ingen väg runt detta. Den enda vägen runt detta är en CLOB-kolumn.

Lösning för 12c

Situationen är annorlunda på Oracle 12c. Där kan du använda parametern MAX_STRING_SIZE = EXTENDED för att häva gränsen upp till 32767 BYTE (se Oracle Database Language Reference, kapitel Datatyper och Oracle Database Reference, kapitel Initieringsparametrar ). Så den uppenbara lösningen är:Uppgradera till Oracle 12c, ställ in MAX_STRING_SIZE = EXTENDED enligt dokumentationen och ändra din tabelldefinition. Du kan förlora några index när du ändrar din tabell, eftersom tidigare till 12c inte index kunde inte hålla VARCHAR2-värden med mer än 4000 BYTE och det kan fortfarande finnas en viss begränsning. (Jag måste kontrollera problemet med indexen och om det kan åtgärdas genom att bygga om indexen).

Lösning:Ändra databaskodning

Du kan försöka ändra din inbyggda databaskodning (hur din databas mappar CHAR till BYTE). För detta måste du vanligtvis skapa en ny databas och ange en lämplig parameter för NLS_CHARACTERSET. Detta är en mycket stor förändring i hur din databas fungerar och kan ha flera biverkningar. Om du någon gång försöker lägga till tecken i en annan kodning kan du ha tur (dvs. du kan inte lagra dem i din databas). Så jag skulle inte föreslå den här lösningen.

Lösning:Byt till CLOB

Vanligtvis är det inte nödvändigt att tillhandahålla godtyckliga frågor på så stora textfält. Du kan försöka identifiera sökfrågorna i den stora textkolumnen och migrera dem till Oracle Text på en CLOB-kolumn. Men detta är en mycket stor förändring och kanske inte är möjlig med ditt befintliga schema eller din applikation. Du kan sluta med ett gäng "INSTÄLLANDE FÖR"-utlösare och med några saknade begränsningskontroller (som inbegriper den nyskapade CLOB-kolumnen).

Lösning:Använd XML

Istället för en CLOB kan du försöka lagra din sträng som en XML-kolumn. Maximal storlek för dessa är 4GB. Det kommer att skada din prestation, du måste tillhandahålla ISTÄLLET FÖR triggers och du kan förlora vissa begränsningar, men det kan fungera för dig.




  1. PDO DBLIB åtkomst till SQL Server 2008 och 2012

  2. Kryptera användardata för automatisk inloggning till tredje parts system

  3. Hur använder man ilike sqlalchemy på postgresql array field?

  4. Importdump för PL/SQL-utvecklare