Да, если ваша база данных Oracle создана с использованием набора символов Unicode, NVARCHAR
в SQL Server следует перенести на VARCHAR2
в Oracle. В Oracle существует тип данных NVARCHAR
, позволяющий приложениям хранить данные с использованием набора символов Unicode, когда набор символов базы данных не поддерживает Unicode.
Однако при миграции следует помнить о семантике длины символа. В SQL Server NVARCHAR(20)
выделяет место для 20 символов, что требует до 40 байтов в UCS-2. В Oracle по умолчанию 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
был изменен. И, наверное, очень мало сторонних скриптов было.
person
Justin Cave
schedule
20.08.2013