1.查看当前 Oracle 数据库的字符集
SELECT * FROM v$nls_parameters t WHERE t.PARAMETER = 'NLS_CHARACTERSET';
执行结果:
PARAMETER | VALUE |
---|---|
NLS_CHARACTERSET | AL32UTF8 |
如果oracle库一开始没有设置好字符集,后续要修改字符集相当麻烦。
- AL32UTF8:表示数据库使用的是 UTF-8 编码,支持多种语言字符,包括中文、英文、日文等。此时,VARCHAR2(n) 中的 n 默认是以字节为单位计算的,1个汉字占3个字节。
- WE8ISO8859P1:表示数据库使用的是 ISO 8859-1 编码,通常用于西欧语言。
- GBK: 支持简体和繁体中文,但它不支持所有语言字符,尤其是一些特殊符号和其他非中文字符(如拉丁语系的特殊字符、希腊字母、部分亚洲字符等),一个字符使用 1 至 2 字节来存储,其中中文字符一般占 2 个字节,英文字符占 1 个字节。建议使用 UTF-8 或 AL32UTF8,因为它们是国际标准字符集,可以处理更多语言,并且更加灵活。
2.强制设置10字符(建表时推荐)
因为java中的string的长度,代表字符,所以,为了简单,在设置数据库字段长度时,直接用字符定义。无论 Oracle 数据库使用的是何种字符集。
CREATE TABLE USER (
LOGIN_USER VARCHAR2(10 CHAR)
);
3.如何区分部分字段被定义了VARCHAR2(10 CAHR)还是VARCHAR2(10 BYTE)
有时建表时,不注意,用了默认的字节,看日志报错后,又把部分字段强制改成字符,这时该如何区分呢?
#Length与LengthB比较
lengthb(string)计算string所占的字节长度
length(string)计算string所占的字符长度
--查询长度会发现oracle中一个汉字占用3个字节
SELECT lengthb(LOGIN_USER),LOGIN_USER FROM USER;
4.当发现全表VARCHAR2默认用了字节,但是想改成字符,改如何修改?
-- 强制修改单个字段的
ALTER TABLE USER MODIFY LOGIN_USER VARCHAR2(128 CHAR);
-- DEMO_TEST库的整个USER表的字节长度,批量修改成对应长度的字符长度(推荐:这种设置完之后,无关字符集,设置的都是字符的长度)。因为java中的string的长度,代表字符,所以,为了简单,建议批量修改。
--生成修改的sql,把结果粘出来自己执行一下就可以了
SELECT 'ALTER TABLE USER MODIFY '||COLUMN_NAME||' VARCHAR2('||DATA_LENGTH||' CHAR);' AS ALTER_SQL FROM ALL_TAB_COLUMNS WHERE DATA_TYPE = 'VARCHAR2' AND TABLE_NAME='USER' AND OWNER='DEMO_TEST';