仿牛商网营销型网站兖州网站建设多少钱
仿牛商网营销型网站,兖州网站建设多少钱,腾讯云服务器租用,建设银行宁波分行招聘网站前言
故事是这样开始的。我们的小DEMO项目的数据库版本从openGauss 2.1.0升级到了5.0.0版本。升级后进行功能验证的时候#xff0c;测试同学发现个BUG#xff0c;原来通过gs_restore导出来的数据再导入时报超长#xff0c;插入失败了#xff0c;如下图所示#xff0c;nva…前言
故事是这样开始的。我们的小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--localezh_CN.utf8 --encodingUTF-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--localezh_CN.utf8 --encodingUTF-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是UTF8template0和template1两个模板数据库的编码格式也是UTF8。 Encoding 77表示UTF8 默认创建的数据库字符集是UTF8。 新建时通过下拉框选择支持如下几种字符集 2. 那么GaussDB支持创建scheme的时候指定和database的encoding不同的charset吗试试看我们创建了一个数据库testdb_ascii字符集是SQL_ASCII。然后在该数据库中创建一个schemacharset指定UTF8执行时报错还不支持。 3. 创建表时会怎么样呢我们试着创建一个指定CHARSET为UTF8的表执行时没有报错是可以执行成功然而查看表信息的时候发现表的字符集仍然是SQL_ASCII说明指定CHARSET的操作并没有执行。创建表 查询表信息 4. 增加列时指定charset会怎么样呢个人理解由于GaussDB是在openGauss基础上进行的云化因此也只在B模式下支持见下图 当我创建了一个B模式的数据库执行相同的SQL报错变了但仍然是没有支持 5. 可见在GaussDB以及openGauss中创建数据库时要确定好字符集否则数据库创建好后就无法再在低一级的Schematable和Column中重新制定遇到不适用的场景只能重新建库。 附录
一些本文中用到的脚本汇总
---不指定字符集安装数据库
gs_install -X /opt/software/openGauss/clusterconfig.xml
---指定字符集为UTF8安装数据库
gs_install -X /opt/software/openGauss/clusterconfig.xml --gsinit-parameter--localezh_CN.utf8 --encodingUTF-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成员。先后就职于大唐电信、华为和软通动力拥有多年项目开发设计和优化运维经验。在数据库领域摸爬滚打多年经历过OracleDB2和SQL Server的时代国产数据库崛起后对华为GaussDB系列数据库进行了深入学习和研究获得华为GaussDB HICA、GaussDB HCIP、GaussDB HICA SI以及openGauss HCIA证书。致力于国产开源数据库在业务项目中的实践和应用。 本篇就到此结束了欢迎交流~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90560.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!