varchar2 dan Unicode untuk mereka yang tidak mengerti apa-apa tentang database Oracle atau ORA-12899: nilai terlalu besar untuk kolom

Kebetulan produk yang kami kembangkan bekerja dengan beberapa database relasional. Sekarang ini adalah MS SQL, Postgres dan Oracle. Ada peluncuran dengan banyak hal dari MySQL hingga almarhum, mungkin Firebird dan Sybase eksotis dengan DB2, tapi bukan itu ceritanya.





Jika dengan MS SQL dan Postgres itu semakin tidak dapat dimengerti dan akrab, maka dengan Oracle setiap kali kita berada dalam beberapa kejutan. Seorang pembaca yang cerdik akan segera melihat bahwa "tangan kita bengkok" dan kita "tidak tahu cara memasaknya", tetapi jika, pembaca yang budiman ingin tahu bagaimana varchar (atau lebih tepatnya varchar2



) di Oracle yang mirip Tuhan berbeda dari saudara-saudaranya, maka tolong, di bawah kucing.





Seperti semua sistem modern, kami menyimpan data dalam format Unicode (saat ini UTF-8). Mengapa ini penting untuk database relasional?





Misalnya, jika Anda memiliki campuran tipe data unicode dan non-unicode dalam database Anda, maka beberapa driver tidak dapat melakukan ini. Misalnya, JTDS - JDBC driver untuk MS SQL server dapat bekerja baik dalam mode Unicode atau Ansi. Karenanya, jika Anda memutuskan untuk "menyimpan" dan membuat kolom non-unicode (varchar / char), maka Anda akan mendapatkan konversi unicode-> ansi pada tingkat penyisipan data ke dalam tabel dan, kemungkinan besar, mencapai efek sebaliknya (setidaknya memperlambat penyisipan data, jika tidak dan dalam pencarian).





Jadi ceritanya. Server aplikasi kami memeriksa panjang maksimum bidang yang diizinkan sebelum memasukkannya (di sini perlu ditetapkan bahwa pemeriksaan dilakukan tidak sesuai dengan data database, tetapi menurut metadata internal kami), tetapi meskipun demikian, terkadang di bawah Oracle kami "menangkap" kesalahan sepertiORA-12899: value too large for column.







? , , Oracle.





. , varchar2



:) 





, ,





alter table address modify street varchar2(150);
      
      



150 - ( -)? - :) .









alter table address modify street varchar2(150 char);
      
      



.. char



-byte



. ( )   - .





, UTF-8, , 4 ( 1 ANSI, 2 4 ).





Unicode !? , , , " ". .. , : legacy, , Unicode' " ", , backup 86 imp - .





? tool, , create table



char



:)





:





, , , .









SELECT value FROM NLSDATABASEPARAMETERS WHERE parameter='NLSLENGTHSEMANTICS';
      
      



, , " ":





SELECT TABLE_NAME, COLUMN_NAME, DATA_LENGTH, CHAR_USED 
FROM USER_TAB_COLUMNS 
WHERE DATA_TYPE = 'VARCHAR2' AND CHAR_USED = 'B'
ORDER BY TABLE_NAME, COLUMN_NAME
      
      



P.S. , , (, 100% ansi ), Unciode … ...





P.P.S. Regexp " " varchar2\(\s*\d+\s*\)







P.P.P.S.  StackOverflow





PPPPS  NLSLENGTHSEMANTICS



 Oracle sangat menganjurkan agar Anda TIDAK menyetel parameter SEMANTIK PANJANG NLS ke CHAR dalam file parameter instance atau server. Hal ini dapat menyebabkan banyak skrip instalasi yang ada menjadi tiba-tiba membuat kolom dengan semantik panjang karakter, yang mengakibatkan error runtime, termasuk buffer overflows. " https://docs.oracle.com/cd/E24693 01 / server.11203 / e24448 / initparams149.htm








All Articles