GB18030字符集使用指南

举报
yd_250323472 发表于 2025/07/25 16:44:17 2025/07/25
【摘要】 gb18030使用指南

GB18030字符集使用指南

1. 前言

适用版本:【9.1.1(及以上)】

  • 解决gbk字符集的因为字符范围不足导致生僻字和少数民族文字无法识别
  • 满足《信息技术产品国家通用语言文字使用管理规定》强制要求

2. GB18030编码介绍

2.1 编码结构与原理

2.1.1 多字节编码体系

GB18030采用1/2/4字节变长编码结构:

字节数 编码范围 字符类型
1字节 0x00-0x7F ASCII兼容字符
2字节 0x81-0xFE 0x40-0x7E/0x80-0xFE 基本汉字区(20902字)
4字节 0x81-0xFE 0x30-0x39 0x81-0xFE 0x30-0x39 扩展区(70,000+汉字)

2.1.2 编码示例

# 常用汉字编码示例
"中" -> 0xD6D0 (2字节)
"䶮" -> 0x9835FC39 (4字节)
"𠀀" -> 0x90308130 (4字节, CJK扩展B)

2.2 标准演进与版本对比

2.2.1 各版本核心差异

特性 GB18030-2000 GB18030-2005 GB18030-2022
汉字数量 27,533 70,244 87,887
支持Unicode版本 3.0 4.0 11.0
新增字符 CJK扩展A CJK扩展B CJK扩展C-G
少数民族文字 基本支持 增强支持 完整支持
部首支持 228部首

2.2.2 汉字覆盖范围

image.png

2.3 GB18030 vs GBK

####2.3.1 技术差异矩阵

维度 GBK GB18030
编码空间 23940字符 160万+字符
字节结构 固定双字节 1/2/4字节变长
Unicode映射 部分支持 完全支持
生僻字支持 < 10% (如"𠀀") 100%覆盖
少数民族文字 不支持 完整支持(苗文、傈僳文等)
Emoji支持 完整支持(😊✅🔥)

2.4 DWS对GB18030的完整支持

2.4.1 支持范围

  • 字符集:完整支持87,887汉字+228部首
  • 少数民族文字:
    • 滇东北苗文 (U+16F00-U+16F9F)
    • 傈僳文 (U+A4D0-U+A4FF)
    • 西夏文 (U+17000-U+187FF)
  • 特殊符号:
    • 易经八卦符号 (U+4DC0-U+4DFF)
    • 太玄经符号 (U+1D300-U+1D35F)
    • 麻将牌符号 (U+1F000-U+1F02F)

3. 环境配置与基本操作

3.1 数据库创建最佳实践

3.1.1 完整建库语句

CREATE DATABASE gb18030_db
    ENCODING = 'GB18030'
    LC_COLLATE = 'zh_CN.GB18030'
    LC_CTYPE = 'zh_CN.GB18030'
    DBCOMPATIBILITY = 'TD'
    TEMPLATE = template0;

3.1.2 参数详解

LC_COLLATE: 指定数据库使用的字符集。例如,gbk编码通过lc_collate=‘zh_CN.gbk’,utf8通过lc_collate=‘en_us.utf8’,gb18030/gb18030-2022通过lc_collate=‘zh_CN.GB18030’。该参数的使用会影响到对字符串的排序顺序,可以通过查pg_collate表找到对应编码的lc_collate。

LC_CTYPE:指定新数据库使用的字符分类。例如,通过lc_ctype = 'zh_CN.gbk’设定该参数。该参数的使用会影响到字符的分类,如大写、小写和数字。默认是使用模板数据库的字符分类。
ENCODING:指定数据库字符集
DBCOMPATIBILITY:兼容Teradata语法

3.2 表与字段级配置

3.2.1 创建支持GB18030的表

-- 普通表
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL COLLATE "zh_CN.gb18030",
    id_card CHAR(18) COLLATE "zh_CN.gb18030"
);
 
-- 分区表示例
CREATE TABLE census_data (
    region_code CHAR(6),
    family_name VARCHAR(20) COLLATE "zh_CN.gb18030",
    population INT
) PARTITION BY range(population)
(PARTITION p1 START(1) END(10) EVERY(1));
 

3.2.2 列级Collation设置

-- 为特定列设置排序规则
ALTER TABLE users 
ALTER COLUMN name TYPE VARCHAR(50) COLLATE "zh_CN.gb18030";
 
-- 查询当前collation配置
SELECT a.attname, c.collname 
FROM pg_attribute a
JOIN pg_collation c ON a.attcollation = c.oid
WHERE a.attrelid = 'users'::regclass;
 

4.应用场景详解

4.1 生僻字处理

4.1.1 生僻字插入与查询

-- 创建测试表
CREATE TABLE rare_characters (
    id SERIAL PRIMARY KEY,
    character TEXT COLLATE "zh_CN.gb18030",
    unicode_point VARCHAR(10)
);
 
-- 插入生僻字示例
INSERT INTO rare_characters (character, unicode_point) VALUES
('䶮', 'U+4DAE'), -- GB18030编码: 0x9835FC39
('𰾅', 'U+30F85'),-- CJK扩展G区
('', 'U+31350'); -- 傈僳文字符
 
-- 查询验证
SELECT * FROM rare_characters 
WHERE character = '䶮';
 
```sql
INSERT INTO t_gb18030 ('䶮');
INSERT 0 1

GB18030字符支持(GB18030支持范围更广)

4.2 GDS数据迁移全流程

4.2.1 完整GDS导入流程

 -- 1. 启动GDS服务
gds -d /data/gds_dir -p ip:port -H address_string -l log_file -D -t worker_num
 
-- 2. 创建外部表
CREATE FOREIGN TABLE gb18030_import (
    id INT,
    full_name TEXT,
    address TEXT
) SERVER gsmpp_server OPTIONS (
    location 'gsfs://ip:port/filepwd',
    format 'text',
    delimiter '|',
    encoding 'GB18030',
    compatible_illegal_chars 'true',
    replace_illegal_chars '',
    fill_missing_fields 'true',
    ignore_extra_data 'true',
    noescaping 'on'
);
 
-- 3. 导入目标表
CREATE TABLE citizens AS 
SELECT * FROM gb18030_import;
 
-- 4. 验证数据
SELECT count(*) FROM citizens;
SELECT * FROM citizens WHERE full_name LIKE '%䶮%';
 
-- 5. 数据导出
CREATE FOREIGN TABLE gds_out
(
    a int not null,
    b text;
    c text;
)SERVER gsmpp_server
    OPTIONS(location 'gsfs://ip:port',
    format 'text',
    delimiter ',',
    compatible_illegal_chars 'True',
    REPLACE_ILLEGAL_CHARS ' '
) WRITE ONLY;
 
INSERT INTO gds_out SELECT * FROM t1 ORDER BY a;

4.3 字符函数应用

4.3.1 编码转换函数

-- 二进制转文本
SELECT convert_from('\x8149', 'GB18030') AS chinese_char; -- 输出:'両'
 
-- 文本转二进制
SELECT convert_to('华为', 'GB18030') AS byte_stream; -- 输出:\xBBAACC
 
-- 编码间转换
SELECT convert('\x8149', 'GB18030', 'UTF8') AS utf8_bytes;
 

4.3.2 字符串处理函数

-- 获取字符数(非字节数)
SELECT char_length('中文䶮'); -- 返回3(3个字符)
 
-- 按字符截取
SELECT substring('中国䶮云南', 3, 2); -- 返回'䶮云'
 
-- 四字节字符处理
SELECT overlay('ABCDEF' 
               PLACING '䶮' 
               FROM 3 FOR 2); -- 返回'AB䶮EF'
 

5. 常见问题

Q1:如何检查数据库当前字符集?

-- 查看数据库编码
SELECT datname, pg_encoding_to_char(encoding) 
FROM pg_database;
SHOW service_encoding;
 
-- 查看客户端编码
SHOW client_encoding;
 

Q2:插入时遇到"invalid byte sequence"错误?
该字符的码位不支持。

参考资料:
[GB18030-2022官方标准文档]

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。