Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: ORACLE: LONG na VARCHAR2 bez utraty danych

Marek Łukianowski:
alter table nazwa_tab add dwarunek3 varchar2(4000 CHAR)

kodowanie nie będzie miało wtedy znaczenia.

Spróbuj zapakować do tej kolumny 1001 japońskich znaków ;)... Ostatecznie 2001 polskich znaków ;).
Przy deklaracji VARCHAR2(4000) baza oracle'a domyślnie podstawia wartość BYTE.

Niekoniecznie. Zależy jak masz zdefiniowaną bazę/użytkownika/sesję.
Marek Łukianowski

Marek Łukianowski Menadżer ds. Rozwoju
Narzędzi IT CABP
S.A.

Temat: ORACLE: LONG na VARCHAR2 bez utraty danych

Łukasz Kurowski:
Marek Łukianowski:
alter table nazwa_tab add dwarunek3 varchar2(4000 CHAR)

kodowanie nie będzie miało wtedy znaczenia.

Spróbuj zapakować do tej kolumny 1001 japońskich znaków ;)... Ostatecznie 2001 polskich znaków ;).
Przy deklaracji VARCHAR2(4000) baza oracle'a domyślnie podstawia wartość BYTE.

Niekoniecznie. Zależy jak masz zdefiniowaną bazę/użytkownika/sesję.

1)
SQL> select * from nls_database_parameters;

PARAMETER VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 10.2.0.1.0

20 rows selected

SQL> create table test_char(a varchar2(2));

Table created

SQL>
Name Type Nullable Default Comments
---- ----------- -------- ------- --------
A VARCHAR2(2) Y

SQL>

Table created
Name Type Nullable Default Comments
---- ---------------- -------- ------- --------
A VARCHAR2(2 CHAR) Y

SQL>

insert into test_char (a) values ('ąę')

ORA-12899: value too large for column "PM"."TEST_CHAR"."A" (actual: 4, maximum: 2)

Commit complete

SQL> insert into test_char_2 (a) values ('ąę')

1 row inserted

Commit complete

SQL> select * from test_char_2;

SQL>

A
--------
ąę


Wydaje mi się, że jednak nie ma przeszkód. :) Choć może coś źle zrozumiałem :)Marek Łukianowski edytował(a) ten post dnia 10.05.11 o godzinie 17:54
Łukasz Kurowski

Łukasz Kurowski Usque Ad Finem

Temat: ORACLE: LONG na VARCHAR2 bez utraty danych

Marek Łukianowski:
insert into test_char (a) values ('ąę')

1. O ile wiem to 2 < 2001. Chodzi o to, że nie zapakujesz do varchar2 więcej niż 4000 bajtów. Znaki utf "narodowe" mają więcej niż 1 bajt. W przypadku 2001 polskich znaczków ich zajętość to 4002 bajty. Do varchara2 nie wpakujesz tego, choćbyś nawet zdefiniował varchar2(4000 CHAR).

> NLS_LENGTH_SEMANTICS

2. No właśnie ;).
Maciej W.

Maciej W. Oracle developer

Temat: ORACLE: LONG na VARCHAR2 bez utraty danych

A select for update nie byłby lepszy? Piszę dla celów dydaktycznych...
Poza tym jakieś zabezpieczenie przed długimi takstami by się przydało (co jeśli w kolumnie jest jakaś wartość o długości >4000?). Chociażby zwykły select max(length(dwarunek)) from nazwa_tab.
I jak już wspomniano - kodowanie może powodować problemy.
Jeszcze jedna sprawa o której nie wspomniano - dokładając kolumnę dorzucamy ją na koniec. Aby zachować kolejność kolumn fajnym sposobem jest stworzenie dodatkowej tabeli (możemy użyć TRUNCATE TABLE oraz unikamy operacji DELETE/UPDATE które są z gruntu bebe).

Temat: ORACLE: LONG na VARCHAR2 bez utraty danych

Ireneusz Ptak:
Wojciech T.:
sprawdzałem, puszczałem - działa.

Ciekawe - jaka wersja Oracle?
U mnie ten skrypt sie wywala - dziala dopiero po zmianie tego kursora w petli.

Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production

A co dokładnie się wywala? Z ciekawości :)

konto usunięte

Temat: ORACLE: LONG na VARCHAR2 bez utraty danych

ORA-00932: inconsistent datatypes: expected - got -

Oracle 10gR2



Wyślij zaproszenie do