Ответ 1
Да, если ваша база данных Oracle создана с использованием набора символов Unicode, NVARCHAR
в SQL Server должен быть перенесен в VARCHAR2
в Oracle. В Oracle существует тип данных NVARCHAR
, позволяющий приложениям хранить данные с помощью набора символов Unicode, когда набор символов базы данных не поддерживает Unicode.
Одна вещь, о которой нужно помнить при миграции, - это семантика длины символов. В SQL Server a NVARCHAR(20)
выделяет пространство для 20 символов, для которого в UCS-2 требуется до 40 байтов. В Oracle по умолчанию a VARCHAR2(20)
выделяет 20 байтов памяти. В наборе символов AL32UTF8
это потенциально достаточно места для 6 символов, хотя, скорее всего, он будет обрабатывать гораздо больше (для одного символа в AL32UTF8
требуется от 1 до 3 байтов. Вероятно, вы хотите объявить свои типы Oracle как VARCHAR2(20 CHAR)
, который указывает, что вы хотите выделить место для 20 символов, независимо от того, сколько байтов требуется. Это, как правило, намного проще в общении, чем попытка объяснить, почему допустимы некоторые 20 символьных строк, в то время как другие 10 символьных строк отклоняются.
Вы можете изменить семантику длины по умолчанию на уровне сеанса, чтобы любые созданные вами таблицы без указания семантики длины использовали семантику символов, а не байтов
ALTER SESSION SET nls_length_semantics=CHAR;
Это позволяет избежать ввода CHAR
каждый раз, когда вы определяете новый столбец. Также возможно установить это на системном уровне, но это не поощряет команда NLS. По-видимому, не все сценарии, которые предоставляет Oracle, были тщательно протестированы в отношении баз данных, где был изменен NLS_LENGTH_SEMANTICS
. И, вероятно, очень мало сторонних скриптов.