由数据插入超长引起的问题——了解GaussDB和openGauss的字符集

news2024/10/6 1:44:22

前言

故事是这样开始的。我们的小DEMO项目的数据库版本从openGauss 2.1.0升级到了5.0.0版本。升级后进行功能验证的时候,测试同学发现个BUG,原来通过gs_restore导出来的数据再导入时报超长,插入失败了,如下图所示,nvarchar(10)的字段类型,无法插入10个汉字—“齐天大圣孙悟空美猴王”。


一、定位过程

疑问一 :openGauss高版本是否没有兼容低版本?

接到问题后以为是openGauss 5.0.0版本没有兼容2.1.0版本的字段类型,于是查阅了官网的资料:

5.0.0版本

2.1.0版本

 

确认发现两个版本对于nvarchar2(n)类型的定义是一样的,都是表示的字符的长度。

疑问二:5.0.0版本和2.1.0版本对字符的定义是否不同?

查看了数据库列表,确认字符集的异同,为了区分截图,同时查询了openGauss的数据库版本。发现2.1.0版本的模板数据库(template0,template1)的字符集(Encoding)是UTF8,而5.0.0版本的模板数据库(template0,template1)的字符集(Encoding)是SQL_ASCII。

2.1.0:

 

而openGauss创建数据库的过程,是通过复制template数据库创建的,默认复制template0,参见官网资料对create database的介绍:

So,如果创建数据库时不专门指定字符集,那么5.0.0版本和2.1.0版本创建的数据库的字符集就是不同的。2.1.0版本创建的数据库的字符集是UTF8,而5.0.0是SQL_ASCII。

2.1.0:

 

 5.0.0:

疑问三:再挖一步,为什么2.1.0版本默认的字符集和5.0.0版本不同呢?

后知后觉的发现原来是因为我之前安装2.1.0环境的时候指定了字符集,指定字符集的命令如下:

gs_install -X /opt/software/openGauss/clusterconfig.xml --gsinit-parameter="--locale=zh_CN.utf8 --encoding=UTF-8"

而安装5.0.0版本的时候没有指定字符集,不指定字符集的命令:

gs_install -X /opt/software/openGauss/clusterconfig.xml

openGauss在不指定字符集的时候默认会是SQL_ASCII,和版本无关,所有版本均如此。

有一点想锤自己且恍然大悟如梦初醒的感觉,不过我们还是继续确认两个字符集的区别。

小结:两个字符集的异同

查阅官网发现,UTF8和SQL_ASCII的字符的长度是不同的,如下图所示:

 

导致数据插入失败的原因算是找到了,字符集的区别导致的。

二、解决方法

1. 安装数据库时显式的指定字符集是UTF8,则默认创建好的模板数据库就会继承安装时指定的字符集;

gs_install -X /opt/software/openGauss/clusterconfig.xml --gsinit-parameter="--locale=zh_CN.utf8 --encoding=UTF-8"

 2. 创建数据库时显式的指定字符集是UTF8,则默认创建好的表就会继承数据库的字符集;

 

3. 创建模式时显示的指定字符集是UTF8,则表的默认字符集就会是UTF8;

该方法仅支持B模式的数据库,且要加载dolphon插件,B模式指兼容mysql,目前还没有实证,后续。--官网文档写的有点简陋了。

 

 4. 创建表时显式的指定字符集是UTF8,则表的默认字符集就会是UTF8;

 

5. 增加列时显式指定列的字符集是UTF8,则该列的字符集就会是UTF8;

逻辑上讲上述4种都可以,遗憾的是目前对表和列指定字符集的功能,在5.0.0版本并未实现功能,只是支持了语法,而指定模式的字符集,参见第二种方式,仅在B模式下实现了。

 

 因此实际操作中,前两种方法都可以,在安装数据库时指定字符集或者创建数据库时指定字符集。指定字符集后再创建表,则表就会继承数据库的字符集,nvarchar(10)就可以支持10个汉字了。

 

三、扩展阅读

GaussDB数据库的默认字符集是什么呢?

1. GaussDB(3.223.0)默认的encoding是UTF8,template0和template1两个模板数据库的编码格式也是UTF8。

 

 Encoding = 7,7表示UTF8

 

 默认创建的数据库字符集是UTF8。

 

 新建时通过下拉框选择,支持如下几种字符集:

 

 2. 那么GaussDB支持创建scheme的时候指定和database的encoding不同的charset吗?试试看,我们创建了一个数据库testdb_ascii,字符集是SQL_ASCII。然后在该数据库中创建一个schema,charset指定UTF8,执行时报错还不支持。

 

3. 创建表时会怎么样呢?我们试着创建一个指定CHARSET为UTF8的表,执行时没有报错,是可以执行成功,然而查看表信息的时候发现,表的字符集仍然是SQL_ASCII,说明指定CHARSET的操作并没有执行。创建表:

 

 查询表信息:

4. 增加列时指定charset会怎么样呢?个人理解,由于GaussDB是在openGauss基础上进行的云化,因此也只在B模式下支持,见下图:

 

 当我创建了一个B模式的数据库,执行相同的SQL,报错变了,但仍然是没有支持:

 

5. 可见在GaussDB以及openGauss中,创建数据库时要确定好字符集,否则数据库创建好后,就无法再在低一级的Schema,table和Column中重新制定,遇到不适用的场景只能重新建库。

 

附录

一些本文中用到的脚本汇总:

---不指定字符集安装数据库

gs_install -X /opt/software/openGauss/clusterconfig.xml

---指定字符集为UTF8安装数据库

gs_install -X /opt/software/openGauss/clusterconfig.xml --gsinit-parameter="--locale=zh_CN.utf8 --encoding=UTF-8"

---不指定字符集创建数据库

create database test_encoding_default;

---指定字符集为UTF8创建数据库

create database test_encoding_utf8 encoding 'utf8';

---切换到另外一个数据库

\c test_encoding_utf8

---指定字符集创建表

create table t (id nvarchar2(10)) charset = 'utf8';

---不指定字符集创建表

create table t (cname nvarchar(10));

create table t (id nvarchar2(10)) ;

---显示表t的详细信息

\d t --detail;

---插入数据

insert into t values('齐天大圣孙悟空美猴王');

---查询字符集,并显示数值value和字符集的对应关系

select encoding,pg_encoding_to_char(encoding) as encoding ,datname from pg_database;

关于作者

本文内容来自于数据库领域资深技术专家赵锋老师,OpenHarmony WEB3 TSG成员。先后就职于大唐电信、华为和软通动力,拥有多年项目开发,设计和优化运维经验。在数据库领域摸爬滚打多年,经历过Oracle,DB2和SQL Server的时代,国产数据库崛起后,对华为GaussDB系列数据库进行了深入学习和研究,获得华为GaussDB HICA、GaussDB HCIP、GaussDB HICA SI以及openGauss HCIA证书。致力于国产开源数据库在业务项目中的实践和应用。

本篇就到此结束了,欢迎交流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VisionMaster图像拼接功能实现

由于硬件或安装环境限制,单个相机视野无法覆盖整个视野,但实际应用需要全视野图像时,可以拍摄物体的多个部分拼接成一张整图。VM提供图像拼接工具对图像进行拼接。 使用标定图进行标定建模是最重要的一步,成功标定后可以将图像无…

Cocos XR的WebBox实现流程

1. 正常3D场景下的webview 1.1 组件角色 Cocos Creator正常3D场景下只有在UI组件才支持webview,即作为下图中的UI Nodes(Canvas Node)的子节点,和3D组件是隔离开的,不能显示在3D空间中,UI Nodes(Canvas Node)是一个平面内的矩形…

新旧Mac恢复出厂设置的方法不同,这里提供新旧Mac不同的重置方法

在某些使用macOS 12 Monterey或更高版本系统的Mac电脑上,你可以使用系统首选项中的内置功能“擦除助手”轻松擦除和重置计算机。以下是操作方法。 要求(以及旧款Mac的提示) 从2021年发布的macOs Monterey(macOs 12)开始,系统首选项现在有一个类似于iPhone和iPad上的“擦…

TraceRoute 跟踪路由工具

随着企业网络需求的不断增长,组织发现监控和管理其网络基础设施变得越来越困难,网络管理员正在转向其他工具和资源,这些工具和资源可以使他们的工作更轻松一些,尤其是在故障排除方面。 目前,网络管理员主要使用简单、…

【日常聊聊】开源软件影响力

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 方向一:开源软件如何推动技术创新 方向二:开源软件的商业模式 方向三:开源软件的安全风险 方…

单机搭建hadoop环境(包括hdfs、yarn、hive)

单机可以搭建伪分布式hadoop环境,用来测试和开发使用,hadoop包括: hdfs服务器 yarn服务器,yarn的前提是hdfs服务器, 在前面两个的基础上,课可以搭建hive服务器,不过hive不属于hadoop的必须部…

某通用引发供应链的思考

本文由掌控安全学院 - 江月 投稿 前言 前段时间看到很多人在打某通用系统,简单记录一下思路。 某通用单位系:xxx奕科技公司 产品如下: 资产还不少,记住这个容器服务平台 等下还要考,以及这个事务中心 可强行接管统一…

QButtonGroup使用介绍

一、简介 QButtonGroup是PyQt5库中的一个组件,主要用于组织和管理一组按钮。通过QButtonGroup,可以方便地实现单选框或多选框功能,统一处理按钮的信号,并且可以为按钮分组设定ID以进行识别。 1、原始工程 from PyQt5.Qt import …

-运算符-

目录 一.算术运算符 (一).四则运算符:加减乘除模(-*/%) (二).增量运算符 - * % (三).自增/自减运算符 -- 二.关系运算符 ! < > < > 三.逻辑运算符&& || ! (一).逻辑与 (表达式1&&表达式2) (二).逻辑或 || (三).逻辑非 ! (四).…

JMeter 下载、安装、启动

JMeter安装部署依赖Java环境&#xff0c;所以首先得安装JDK。 JDK下载JDK环境变量配置 ① 新建系统环境变量JAVA_HOME ② 编辑系统变量Path ③ 新建系统变量CLASSPATH变量 JMeter下载安装 Apache JMeter - Apache JMeter™ JMeter安装部署依赖Java环境&#xff0c;所以首…

Framework - ActivityThread 应用启动UI渲染流程

一、概念 ActivityThread拥有 main(String[] agrs) 方法&#xff0c;作为程序的入口&#xff0c;是应用程序的初始化类。&#xff08;ActivityThread不是主线程&#xff0c;它在 main() 方法中实例化&#xff0c;是运行在主线程中。&#xff09;ApplicationThread是 ActivityT…

Docker搭建MySQL8主从复制

之前文章我们了解了面试官&#xff1a;说一说Binlog是怎么实现的&#xff0c;这里我们用Docker搭建主从复制环境。 docker安装主从MySQL 这里我们使用MySQL8.0.32版本&#xff1a; 主库配置 master.cnf //基础配置 [client] port3306 socket/var/run/mysqld/mysql.sock [m…

java(面向对象基础)

面向对象的三大特征&#xff1a;封装、继承、多态 一、封装 用 类设计对象处理某一个事物的数据时&#xff0c;应该把要处理的数据&#xff0c;以及处理这些数据的方法&#xff0c;设计到一个对象中去。 封装规范&#xff1a;合理隐藏&#xff0c;合理暴露&#xff08;先将成…

力扣hot100 编辑距离 多维DP

Problem: 72. 编辑距离 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考地址 Code ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂度: O ( n m ) O(nm) O(nm) class Solution {public int minDistance(String s1, String s2){int n s1.lengt…

MongoDB基础认识

MongoDB数据库介绍 名称源自“humongous”&#xff08;意为“巨大无比”&#xff09;。MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。MongoDB 旨在为WEB应用提…

备战蓝桥杯---搜索(DFS基础1)

何为深搜&#xff1f; 即不撞南墙不罢休。 话不多说&#xff0c;直接看题&#xff1a; 我们可以把这看成深搜的模板题&#xff0c;下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int a[15];//存值并输出 int vis[15]; int n18; void dfs(int …

Nicn的刷题日常之喝汽水问题

目录 1.题目描述 2.解题思路 3.解题 4.思路2 解题 1.题目描述 喝汽水&#xff0c;1瓶汽水1元&#xff0c;2个空瓶可以换一瓶汽水&#xff0c;给20元&#xff0c;可以喝多少汽水&#xff08;编程实现&#xff09;。 2.解题思路 1. 20元首先可以喝20瓶&#xff0c;此时手…

书生浦语2-对话-20B大模型部署实践

简介 书生浦语2.0是一个大语言模型&#xff0c;是商汤科技与上海 AI 实验室联合香港中文大学和复旦大学发布的新一代大语言模型。‘ 具体特性 有效支持20万字超长上下文&#xff1a;模型在 20 万字长输入中几乎完美地实现长文“大海捞针”&#xff0c;而且在 LongBench 和 L…

Python程序设计 函数基础

简单函数 函数&#xff1a;就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。 函数的使用包含两个步骤&#xff1a; 定义函数 —— 封装 独立的功能 调用函数 —— 享受 封装 的成果 函数的作用&#xff0c;在开发程序时&#xff0c;使用…

2024年美赛F题超详细思路

Problem F: Reducing Illegal Wildlife Trade 美赛F题以非法野生动物贸易为背景进行命题&#xff0c;需要我们选择客户进行一系列的问题。本文正式解题前需要收集客户的数据以及数据预处理。对于客户的选择&#xff0c;这里考虑的点在于该客户需要能够对非法贸易交易产生影响。…