Определение набора символов для столбца Для таблиц базы данных оракула

Я выполняю следующий запрос в SQL * Plus

CREATE TABLE  tbl_audit_trail (
  id NUMBER(11) NOT NULL,
  old_value varchar2(255) NOT NULL,
  new_value varchar2(255) NOT NULL,
  action varchar2(20) CHARACTER SET latin1 NOT NULL,
  model varchar2(255) CHARACTER SET latin1 NOT NULL,
  field varchar2(64) CHARACTER SET latin1 NOT NULL,
  stamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  user_id NUMBER(11) NOT NULL,
  model_id varchar2(65) CHARACTER SET latin1 NOT NULL,
  PRIMARY KEY (id),  
  KEY idx_action (action)
);

Я получаю следующую ошибку:

action varchar2(20) CHARACTER SET latin1 NOT NULL,
                      *
ERROR at line 5:
ORA-00907: missing right parenthesis

Вы можете предположить, что мне не хватает?

Ответ 1

Простой ответ заключается в том, что, в отличие от MySQL, наборы символов не могут быть определены на уровне столбца (или таблицы). Latin1 не является допустимым набором символов Oracle.

Наборы символов согласованы по всей базе данных и будут указаны при создании базы данных. Вы можете найти своего персонажа, запросив NLS_DATABASE_PARAMETERS,

select value
  from nls_database_parameters
 where parameter = 'NLS_CHARACTERSET'

Полный список возможных наборов символов доступен для 11g r2 и для 9i или вы можете запросить V$NLS_VALID_VALUES.

Можно использовать оператор ALTER SESSION, чтобы установить NLS_LANGUAGE или NLS_TERRITORY, но, к сожалению, вы не можете сделайте это для набора символов. Я считаю, что это связано с тем, что изменение языка изменило то, как Oracle будет отображать сохраненные данные, тогда как изменение набора символов изменило бы то, как Oracle хранит данные.

При отображении данных вы можете, конечно, указать требуемый набор символов в зависимости от того, какой клиент вы используете.

Миграция набора символов - это не тривиальная задача, и ее нельзя делать легко.

С легкой стороны обратите внимание, почему вы пытаетесь использовать Latin 1? Было бы более обычным настраивать новую базу данных в виде UTF-8 (иначе известный как AL32UTF8 - не использовать UTF8) или UTF-16, чтобы эффективно хранить многобайтовые данные. Даже если вам это не нужно, теперь разумно пытаться - никаких гарантий в жизни - для будущего доказательства вашей базы данных, без необходимости мигрировать в будущем.

Если вы хотите указать разные наборы символов для разных столбцов в базе данных, лучшим вариантом будет определить, действительно ли это требование необходимо, и попытаться удалить его. Если это определенно необходимо 1 то лучшим выбором может быть использование набора символов, который является надмножеством всех потенциальных наборов символов. Затем у вас есть какое-то контрольное ограничение, которое ограничивает столбец конкретными шестнадцатеричными значениями. Я бы не рекомендовал делать это вообще, вероятность ошибок в ползучести огромна и чрезвычайно сложна. Кроме того, различные наборы символов выставляют разные шестнадцатеричные значения по-разному. Это, в свою очередь, означает, что вам необходимо обеспечить, чтобы столбец отображался в определенном символе, что невозможно, так как оно выходит за пределы базы данных.

<суб > 1. Мне было бы интересно узнать ситуацию

Ответ 2

Согласно предоставленному заявлению DDL, некоторые из них должны использовать 2 набора символов. Реализация этой функциональности в Oracle отличается от MySQL и выполняется с n * типами данных, такими как nvarchar2, nchar... Latin1 похож на некоторые западноевропейские символы, которые могут быть по умолчанию. Таким образом, вы можете определить, например, "Latin1" (WE **) и некоторый Unicode (UTF8..).

Тип данных NVARCHAR2 был введен Oracle для баз данных, которые хотят использовать Unicode для некоторых столбцов, сохраняя при этом другой набор символов для остальной базы данных (которая использует VARCHAR2). NVARCHAR2 является типом данных только для Unicode. Причина, по которой вы хотите использовать NVARCHAR2, может заключаться в том, что ваша БД использует символ не Юникода, и вы все равно хотите хранить данные Unicode для некоторых столбцов. Столбцы в вашем примере могут хранить одни и те же данные, однако хранилище байтов будет отличаться.