gpt4 book ai didi

oracle - 为 oracle 数据库表定义列的字符集

转载 作者:行者123 更新时间:2023-12-04 00:05:26 24 4
gpt4 key购买 nike

我在 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

你能建议我错过什么吗?

最佳答案

简单的答案是,与 MySQL 不同,字符集不能在 column (or table) level 处定义。 . Latin1也不是有效的 Oracle 字符集。

字符集在整个数据库中是一致的,并且将在您创建数据库时指定。您可以通过查询 NLS_DATABASE_PARAMETERS 找到您的角色。 ,

select value
from nls_database_parameters
where parameter = 'NLS_CHARACTERSET'

可能的字符集的完整列表可用于 11g r2for 9i或者您可以查询 V$NLS_VALID_VALUES .

可以使用 ALTER SESSION statement设置 NLS_LANGUAGENLS_TERRITORY ,但不幸的是,您不能为字符集执行此操作。我相信这是因为改变语言会改变 Oracle 显示存储数据的方式,而改变字符集会改变 Oracle 存储数据的方式。

显示数据时,您当然可以在您使用的任何客户端中指定所需的字符集。

Character set migration不是一项微不足道的任务,不应掉以轻心。

稍微说明一下,您为什么要尝试使用拉丁语 1?以 UTF-8(也称为 AL32UTF8 - 不要使用 UTF8 )或 UTF-16 之类的方式设置新数据库会更正常,以便您可以有效地存储多字节数据。即使您现在不需要它,明智的做法是尝试 - 生活中没有任何保证 - 将来证明您的数据库而无需将来迁移。

如果您希望为数据库中的不同列指定不同的字符集,那么更好的选择是确定此要求是否真的有必要并尝试将其删除。如果绝对有必要1,那么最好的办法可能是使用一个字符集,它是所有潜在字符集的超集。然后,使用某种检查约束将列限制为特定的十六进制值。我根本不建议这样做,错误蔓延的可能性很大,而且非常复杂。此外,不同的字符集以不同的方式呈现不同的十六进制值。反过来,这意味着您需要强制以特定字符呈现列,这是不可能的,因为它超出了数据库的范围。

1.我有兴趣了解情况

关于oracle - 为 oracle 数据库表定义列的字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9956433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com