2013-08-20 58 views
13

Bazı verileri sql sunucusundan oracle'e geçiriyoruz. SQL Server'da NVARCHAR olarak tanımlanmış sütunlar için Oracle'da benzer olduklarını düşünerek NVARCHAR sütunları oluşturmaya başladık. Ancak öyle değiller.arasındaki fark nedir?

ben stackoverflow mesajların birkaç okumak ve benim bulguları doğrulamak için istiyorlar. veritabanı karakter seti (bizim durumumuzda için geçerlidir) AL32UTF8 söylemek ise

Oracle VARCHAR2 zaten unicode destekler. Unicode desteği yoktur.

SQLServer VARCHAR, desteklemez. SQLServer açıkça, unicode (özellikle 2 bayt UCS-2 biçiminde) veri depolamak için NCHAR/NVARCHAR türünde olması gereken sütunlar gerektirir ..

Bu nedenle SQL Server NVARCHAR sütunlarının Oracle olarak taşınabilmesi gerektiğini söylemek doğru olur. VARCHAR2 sütunları?

+0

Microsoft, Oracle NVARCHAR2 <==> SQLServer NVARCHAR.'ı doğruladı. Ancak onaylamak istediklerim Oracle VARCHAR2 <==> SQLServer NVARCHAR? (oracle VARCHAR2 unicode olarak hazırdır) – Zenil

cevap

22

Evet, Oracle veritabanınız bir Unicode karakter kümesi kullanılarak oluşturulduysa, SQL Server'da NVARCHAR, Oracle'da bir VARCHAR2'a geçirilmelidir. Oracle'da, NVARCHAR veri türü, veritabanı karakter kümesi Unicode'u desteklemediğinde uygulamaların Unicode karakter kümesi kullanarak veri depolamasına izin vermek için vardır.

Bir şey taşırken, ancak, karakter uzunluğu semantik farkında olmak. SQL Server'da, NVARCHAR(20), UCS-2'de 40 bayta kadar gerektiren 20 karakter için yer ayırır. Oracle'da, varsayılan olarak, bir VARCHAR2(20), 20 bayt depolama alanı ayırır. En sen misin o. Muhtemelen Oracle türlerini beyan etmek istiyorum çok daha (AL32UTF8 yılında tek bir karakter 1 ile 3 bayt gerektirir idare edecek ihtimalini gösterir hangi VARCHAR2(20 CHAR) olarak gerçi AL32UTF8 karakter setinde, o 6 karakterler için sadece yeterli alan potansiyel olarak Ne kadar çok bayt gerektirdiğine bakılmaksızın 20 karakter için alan ayırmak istiyorum: Bu, diğer 10 karakter dizgisi reddedilirken bazı 20 karakter dizesinin neden reddedildiğini açıklamaya çalışmaktan çok daha kolay iletişim kurma eğilimindedir.

oturum düzeyinde varsayılan uzunluğu semantik böylece bayt semantik yerine karakterini kullanacak herhangi bir uzunlukta anlambilimini belirtmeden oluşturduğunuz herhangi tablolar

ALTER SESSION SET nls_length_semantics=CHAR; 

Bu, yeni bir sütun tanımladığınızda her zaman CHAR yazmayı önlemenize izin verir. Sistem seviyesinde, ancak NLS ekibi tarafından cesaretlendirilmediğini de ayarlamak mümkündür - görünüşe göre, Oracle'ın sunduğu tüm betikler, NLS_LENGTH_SEMANTICS'un değiştirildiği veritabanlarına karşı kapsamlı bir şekilde test edilmemiştir. Ve muhtemelen çok az sayıda üçüncü taraf betiği olmuştur.

+0

Harika cevap ... Birkaç sorum vardı ... Ne zaman göç yaparsak, veri kesilme sorunları konusunda endişelenmeli miyiz? Tüm Oracle sütunlarını VARCHAR2 olarak oluşturduğumuzu varsayalım. Sonra bir SQL Server VARCHAR sütunundan herhangi bir veri doğru olarak taşınmalıdır. Bir SQL Server NVARCHAR sütunundan ne haber? SQL Server NVARCHAR verileri UTF-16'da depolar, Oracle VARCHAR2 ise UTF-8'dir. Göç aracı bir şekilde bununla ilgilenmeli mi? Lütfen düşüncelerinizi ana cevaba ekleyiniz .. – Zenil

+1

@Zenil - Ben bunun cevabımdan geçtiğine inanıyorum. Oracle'daki sütunları tanımlarken karakter uzunluğunun anlamını kullandığınızı varsayarsak, Oracle 'varchar2 (20 karakter)' i ve SQL Server 'nvarchar (20) 'ınızın her birinin 20 karakter için alanı olacaktır.Her birinin 20 karakter için alanı varsa, kesme sorunları hakkında endişelenmenize gerek yok. –

+0

Sanırım kesme sorununu çözdünüz ama kodlama sorununu değil. SQL server NVARCHAR sütunu UTF-16'da kodlanırken, oracle VARCHAR2 sütunu UTF-8 olarak kodlanacaktır. Sanırım göç aracı bu gerçeğin farkında olmalı ve doğru dönüşümleri yapmalı. Bu aşamaya geldiğimizde bunu bulmalıyım .. – Zenil