Определение набора символов для столбца Для таблиц базы данных Oracle - PullRequest
12 голосов
/ 31 марта 2012

Я выполняю следующий запрос в 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

Можете ли вы подсказать, что мне не хватает?

Ответы [ 2 ]

30 голосов
/ 31 марта 2012

Простой ответ заключается в том, что в отличие от 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 хранит данных.

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

Миграция набора символов не является тривиальной задачей и не должна выполняться легко.

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

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

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

4 голосов
/ 02 апреля 2014

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

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

...