Ash*_*ali 12 oracle character-encoding oracle9i
我在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)
);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
action varchar2(20) CHARACTER SET latin1 NOT NULL,
*
ERROR at line 5:
ORA-00907: missing right parenthesis
Run Code Online (Sandbox Code Playgroud)
你能说一下我错过了什么吗?
Ben*_*Ben 30
简单的答案是,与MySQL不同,字符集不能在列(或表)级别定义.Latin1也不是有效的Oracle字符集.
字符集在整个数据库中是一致的,并且在创建数据库时已指定.你可以通过查询找到你的角色NLS_DATABASE_PARAMETERS,
select value
from nls_database_parameters
where parameter = 'NLS_CHARACTERSET'
Run Code Online (Sandbox Code Playgroud)
完整的可能字符集列表可用于11g r2和9i,您也可以查询V$NLS_VALID_VALUES.
可以使用该ALTER SESSION语句来设置NLS_LANGUAGE或者NLS_TERRITORY,但遗憾的是,您不能为字符集执行此操作.我相信这是因为改变语言会改变Oracle 显示存储数据的方式,而更改字符集会改变Oracle 存储数据的方式.
显示数据时,您当然可以在您使用的任何客户端中指定所需的字符集.
字符集迁移不是一项简单的任务,不应轻易完成.
稍微注意一下你为什么要使用Latin 1?以UTF-8(也称为AL32UTF8- 不使用UTF8)或UTF-16 等方式设置新数据库更为常见,这样您就可以有效地存储多字节数据.即使你现在不需要它,但是明智的做法 - 在生活中没有任何保证 - 将来证明你的数据库,而不需要在将来进行迁移.
如果您希望为数据库中的不同列指定不同的字符集,那么更好的选择是确定是否真的需要此要求并尝试将其删除.如果肯定是必要的1那么你最好的选择可能是使用一个字符集,它是所有潜在字符集的超集.然后,使用某种检查约束将列限制为特定的十六进制值.我根本不建议这样做,错误蔓延的可能性很大,而且非常复杂.此外,不同的字符集会以不同的方式呈现不同 反过来,这意味着您需要强制在特定字符中呈现列,这是不可能的,因为它超出了数据库的范围.
我有兴趣知道这种情况
| 归档时间: |
|
| 查看次数: |
21716 次 |
| 最近记录: |