Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


字符集

📄字数 3.3K
👁️阅读量 加载中...

一、概述

数据库字符集(Character Set)决定数据库中如何存储和解释字符串数据。正确设置字符集对于多语言支持、避免乱码、以及系统兼容性非常重要。

虚谷数据库的字符集支持库级字符集,支持的字符集如表1所示:

字符集描述语言/地区编码字节数别名/备注与其他字符集关系
BIG5繁体中文标准繁体中文1~2 字节BIG5-HKSCS(扩展)与 GB 系列不兼容
BINARY非文本,按字节存储任意二进制1 字节适用于原始数据存储
CP1250Windows 编码页,兼容中欧语言捷克、波兰等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 936GB18030 是其超集
LATIN1ISO 8859-1,西欧语言支持英、德、法等西欧语言1 字节cp1252(近似)常见老系统默认编码
LATIN2ISO 8859-2,中欧语言支持捷克、波兰等1 字节与 Latin1 并列,覆盖不同语言
UTF-8Unicode 最流行编码方式所有语言1~3 字节可视为 GB18030 的国际通用替代品

二、默认字符集

虚谷数据库将字符集分为库字符集与会话字符集,其中库字符集用于设置数据库存储和解释字符串数据的表示,会话字符集用于设置客户端与数据库之间进行会话的字符串数据表示。

2.1 库字符集

  1. 默认库的默认字符集

虚谷数据库提供一个默认数据库 SYSTEM,称为系统库,其字符集为 UTF8.UTF8_GENERAL_CI,该默认字符集不可修改。

  1. 新建用户库的默认字符集

虚谷数据库新建用户库的默认字符集为 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.

提示

  1. COLLATE_NAME 列中,bin后缀与 ci 后缀字符集区别:bin 区分大小写,ci 不区分大小写

  2. 同一字符集不同后缀也涉及字符集转换问题

3.2 数据库字符集

  1. 当前在系统库下
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 字段显示的值为创建数据库所使用的字符串值,区分大小写

  1. 当前在被查询的库下
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 字符集为其超集, 因此:

  1. 虚谷数据库中以 GBK 字符集打开 GB2312 字符集创建的数据库

  2. 使用 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.

提示

  1. 虚谷数据库默认将 def_charset 设置为 GBK
  2. 新建数据库时,若不指定字符集,则采用默认字符集设置

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.

注意

字符集转换后,如果会话字符集与转换后字符集不兼容,可能出现乱码现象