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

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

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


person Ashwin N Bhanushali    schedule 31.03.2012    source источник
comment
@Andriod_crazy: эта ошибка для меня новая, но мой первый подход - найти набор символов SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET', а затем проверить, поддерживает ли он latin или нет.   -  person Gaurav Soni    schedule 31.03.2012
comment
@GauravSoni, ошибка не будет новой :-). Это просто стандартная синтаксическая ошибка.   -  person Ben    schedule 31.03.2012
comment
@Ben: Да, вы правы, но это не конкретная ошибка, из которой мы можем найти основную причину. error is new to me означает, что я никогда не видел ошибки из-за character set :) Даже я не знаю character sets can't be defined at column level спасибо за ответ +1 за это   -  person Gaurav Soni    schedule 31.03.2012
comment
Не могли бы вы объяснить, чего не хватает в моем текущем ответе @AloneInTheDark?   -  person Ben    schedule 31.03.2014
comment
Вы проверили причину моей награды? Этому вопросу не уделялось должного внимания. Я хочу, чтобы альтернативные комментарии об этой ситуации.   -  person AloneInTheDark    schedule 31.03.2014
comment
Извините, но мне все еще не совсем ясно. Вы имеете в виду, что вам нужен способ определения набора символов уровня столбца в Oracle?   -  person Ben    schedule 31.03.2014
comment
Я думаю, что у вас есть 2 варианта здесь. varchar2, который находится в базовой кодировке базы данных, или nvarchar2, который находится в национальной кодировке. Насколько мне известно, вы не можете определить другую кодировку полей напрямую, как это.   -  person tbone    schedule 31.03.2014
comment
Может быть, не на уровне столбца, а на уровне таблицы.   -  person AloneInTheDark    schedule 01.04.2014


Ответы (2)


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

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

select value
  from nls_database_parameters
 where parameter = 'NLS_CHARACTERSET'

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

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

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

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

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

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

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

person Ben    schedule 31.03.2012
comment
CREATE TABLE utf_test ( coll VARCHAR(50) NOT NULL CHARACTER SET utf8 ); выдает ту же ошибку ORA-00907: missing right parenthesis, что мне делать, сэр? - person masT; 07.05.2014
comment
Пожалуйста, не используйте NCHAR, если вы не уверены, что делаете @masT. Используйте NVARCHAR2... - person Ben; 08.05.2014

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

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

person Community    schedule 02.04.2014
comment
Хороший момент - можно иметь 2 набора символов; стоит отметить, что набор символов NVARCHAR2 представляет собой либо UTF-16, либо старое подмножество Oracle UTF-8 (которое ошибочно называют UTF8). Это также вызовет некоторые проблемы со стандартными функциями. - person Ben; 03.04.2014