字符集
📄字数 3.3K
👁️阅读量 加载中...
一、概述
数据库字符集(Character Set)决定数据库中如何存储和解释字符串数据。正确设置字符集对于多语言支持、避免乱码、以及系统兼容性非常重要。
虚谷数据库的字符集支持库级字符集,支持的字符集如表1所示:
字符集 | 描述 | 语言/地区 | 编码字节数 | 别名/备注 | 与其他字符集关系 |
---|---|---|---|---|---|
BIG5 | 繁体中文标准 | 繁体中文 | 1~2 字节 | BIG5-HKSCS(扩展) | 与 GB 系列不兼容 |
BINARY | 非文本,按字节存储 | 任意二进制 | 1 字节 | 无 | 适用于原始数据存储 |
CP1250 | Windows 编码页,兼容中欧语言 | 捷克、波兰等 | 1 字节 | Windows-1250 | 类似 Latin2,微软版本 |
GB13000 | 对 Unicode 1.1 的兼容适配 | 中文 | 1~2 字节 | 等同 ISO/IEC 10646 | 与 GB 系列独立,后被 GB18030 取代 |
GB18030 | 中国国家强制标准,支持全部 Unicode 字符 | 全世界语言 | 1~2 字节 | 无(现代中文推荐) | 完全兼容 GBK、GB2312,等价于 Unicode |
GB2312 | 简体中文字符集早期标准 | 简体中文 | 1~2 字节 | EUC-CN(近似) | GBK 是其扩展 |
GBK | 向下兼容 GB2312,新增繁体/日文/符号等 | 简繁中文 | 1~2 字节 | Code Page 936 | GB18030 是其超集 |
LATIN1 | ISO 8859-1,西欧语言支持 | 英、德、法等西欧语言 | 1 字节 | cp1252(近似) | 常见老系统默认编码 |
LATIN2 | ISO 8859-2,中欧语言支持 | 捷克、波兰等 | 1 字节 | 无 | 与 Latin1 并列,覆盖不同语言 |
UTF-8 | Unicode 最流行编码方式 | 所有语言 | 1~3 字节 | 无 | 可视为 GB18030 的国际通用替代品 |
二、默认字符集
虚谷数据库将字符集分为库字符集与会话字符集,其中库字符集用于设置数据库存储和解释字符串数据的表示,会话字符集用于设置客户端与数据库之间进行会话的字符串数据表示。
2.1 库字符集
- 默认库的默认字符集
虚谷数据库提供一个默认数据库 SYSTEM
,称为系统库,其字符集为 UTF8.UTF8_GENERAL_CI
,该默认字符集不可修改。
- 新建用户库的默认字符集
虚谷数据库新建用户库的默认字符集为 GBK
,可通过修改 SETUP/xugu.ini
文件中 def_charset
变量的值来修改新建用户库的默认字符集,或者在登录数据库后使用命令set def_charset to utf8
修改新建用户库的默认字符集。
2.2 会话字符集
客户端应用如控制台,驱动等与服务器交互过程中,客户端将以某一字符集表示的数据发送给服务端,服务端执行结束后以相同的字符集表示的执行结果返回给客户端,两者进行数据交互所采用的字符集即为会话字符集。
虚谷数据库默认会话字符集为 GBK
,可通过命令 SET char_set TO UTF8
修改默认会话字符集。
注意
客户端可能在建立连接时指定会话字符集,默认会话字符集会被指定的会话字符集覆盖
建立连接后,SET char_set TO UTF8
对当前会话生效。重新连接需要重新设置该字符集,否则为建立连接时设置的字符集,未设置则为默认会话字符集
三、字符集查看
3.1 可用字符集
虚谷数据库支持多种字符集,要显示可用的字符集,可查询表 SYS_CHARSETS
或使用命令 SHOW charsets
。
sql
SQL> SELECT * FROM SYS_CHARSETS;
+--------------+-------------------------+-----------+-----------+---------+
| CHARSET_NAME | COLLATE_NAME | MAX_BYTES | MIN_BYTES | COMMENT |
+--------------+-------------------------+-----------+-----------+---------+
| gb13000 | gb13000_bin | 2 | 1 | |
| gb13000 | gb13000_chinese_ci | 2 | 1 | |
| gb18030 | gb18030_chinese_ci | 2 | 1 | |
| gb18030 | gb18030_bin | 2 | 1 | |
| gb18030_2022 | gb18030_2022_chinese_ci | 2 | 1 | |
| gb18030_2022 | gb18030_2022_bin | 2 | 1 | |
| gbk | gbk_chinese_ci | 2 | 1 | |
| gbk | gbk_bin | 2 | 1 | |
| gb2312 | gb2312_chinese_ci | 2 | 1 | |
| gb2312 | gb2312_bin | 2 | 1 | |
| big5 | big5_chinese_ci | 2 | 1 | |
| big5 | big5_bin | 2 | 1 | |
| binary | binary | 1 | 1 | |
| latin2 | latin2_czech_cs | 1 | 1 | |
| latin1 | latin1_swedish_ci | 1 | 1 | |
| latin1 | latin1_bin | 1 | 1 | |
| latin1 | latin1_german2_ci | 1 | 1 | |
| utf8 | utf8_general_ci | 3 | 1 | |
| utf8 | utf8_bin | 3 | 1 | |
| cp1250 | cp1250_czech_cs | 1 | 1 | |
+--------------+-------------------------+-----------+-----------+---------+
(20 rows)
Use time:1 ms.
提示
COLLATE_NAME
列中,bin
后缀与ci
后缀字符集区别:bin
区分大小写,ci
不区分大小写同一字符集不同后缀也涉及字符集转换问题
3.2 数据库字符集
- 当前在系统库下
sql
SQL> SELECT CHAR_SET FROM DBA_DATABASES WHERE DB_NAME='SYSTEM';
+----------------------+
| CHAR_SET |
+----------------------+
| UTF8.UTF8_GENERAL_CI |
+----------------------+
(1 row)
Use time:1 ms.
注意
SELECT CHAR_SET FROM DBA_DATABASES
查看数据库使用的字符集时,CHAR_SET
字段显示的值为创建数据库所使用的字符串值,区分大小写
- 当前在被查询的库下
sql
SQL> SHOW DB_INFO
+---------+-------+----------+----------------------+-----------+
| DB_NAME | DB_ID | DB_OWNER | DB_CHARSET | DB_TIMEZ |
+---------+-------+----------+----------------------+-----------+
| SYSTEM | 1 | SYS | UTF8.UTF8_GENERAL_CI | GMT+08:00 |
+---------+-------+----------+----------------------+-----------+
(1 row)
Use time:0 ms.
注意
GB2312
字符集为早期标准,很多汉字未被其包含,且 GBK
字符集为其超集, 因此:
虚谷数据库中以
GBK
字符集打开GB2312
字符集创建的数据库使用
SHOW DB_INFO
查看字符集为GB2312
创建的数据库时,显示的编码为GBK
3.3 新建库默认字符集
sql
SQL> SHOW def_charset
+-------------+
| DEF_CHARSET |
+-------------+
| UTF8 |
+-------------+
(1 row)
Use time:0 ms.
3.4 会话字符集
sql
SQL> SHOW CHAR_SET
+----------+
| CHAR_SET |
+----------+
| UTF8 |
+----------+
(1 row)
Use time:1 ms.
四、字符集设置
注意
在不指定字符集的 bin
后缀和 ci
后缀时,虚谷数据库使用 bin
类字符集(因此会区分大小写)
4.1 新建库默认字符集
4.1.1 配置文件设置
通过修改SETUP/xugu.ini
文件中 def_charset
变量的值进行设置
4.1.2 命令设置
语法:
sql
SET def_charset TO charset_name
参数说明:
charset_name
:表示要设置的字符集名称
示例:
sql
SQL> SET def_charset TO UTF8
Execute successful.
Use time:3 ms.
SQL> SHOW def_charset
+-------------+
| DEF_CHARSET |
+-------------+
| UTF8 |
+-------------+
(1 row)
Use time:0 ms.
提示
- 虚谷数据库默认将
def_charset
设置为GBK
- 新建数据库时,若不指定字符集,则采用默认字符集设置
4.2 新建库指定字符集
sql
-- 创建数据库,并指定其默认字符集为 GBK
SQL> CREATE DATABASE db_test CHAR SET 'GBK';
Execute successful.
Use time:3 ms.
SQL> CREATE DATABASE db_test CHARACTER SET 'GBK';
Execute successful.
Use time:3 ms.
4.3 会话字符集
语法:
sql
SET char_set TO charset_name
参数说明:
charset_name
:表示要设置的字符集名称
sql
SQL> SET char_set TO UTF8
Execute successful.
Use time:1 ms.
SQL> SHOW char_set
+----------+
| CHAR_SET |
+----------+
| UTF8 |
+----------+
(1 row)
Use time:1 ms.
提示
切换数据库时,会话字符集不发生变化;如果需要,请手动切换。
五、字符集转换
将字符串、RAW 数据按给定字符集类型进行转换,转换结果直接返回给客户端。
sql
-- 字符串数据类型转换
SQL> SELECT CONVERT('TEST_CONVERT','GBK');
+--------------+
| EXPR1 |
+--------------+
| TEST_CONVERT |
+--------------+
(1 row)
Use time:1 ms.
-- RAW 数据类型转换
SQL> SELECT to_char(UTL_RAW.CONVERT(UTL_RAW.CAST_TO_RAW('HELLO'),'GBK','UTF8')) result FROM DUAL;
+--------+
| result |
+--------+
| HELLO |
+--------+
(1 row)
Use time:0 ms.
注意
字符集转换后,如果会话字符集与转换后字符集不兼容,可能出现乱码现象