【openGauss】把应用开发中的设置客户端字符编码往细了说

news2024/11/18 2:39:14

前言

早前写过两篇有关Oracle字符集的文章
【ORACLE】谈一谈Oracle数据库使用的字符集,不仅仅是乱码
【ORACLE】谈一谈NVARCHAR2、NCHAR、NCLOB等数据类型和国家字符集
基本说明了 ”数据字符编码“、”客户端字符编码“、”数据库字符编码“三者的关系,这些关系,对于openGauss/MogDB/postgresql其实是一样的,即”数据字符编码“和”客户端字符编码“应保持一致,且对应的字符集为”数据库字符集“的”子集“。但是实际应用开发中,”客户端字符编码“在没有进行主动设定时,往往会受各种因素干扰,比如各种环境变量和数据库参数。本文就针对各种客户端,通过文档加实验来对客户端字符编码应该如何设置来做个分析说明(注:本文的测试环境操作系统为centos7.9)

设置客户端字符编码的各种方式

在openGauss中,可以通过很多方式来设置客户端字符集,但实际上最终影响的都是在数据库连接中的 client_encoding,该值可以通过执行 show client_encoding; 来进行查看。

操作系统环境变量

  1. LANG
export LANG=zh_CN.UTF-8
  1. LC_CTYPE
export LC_CTYPE=zh_CN.UTF-8
  1. PGCLIENTENCODING
export PGCLIENTENCODING=UTF-8

数据库级参数

  1. alter databse dbname set client_encoding=‘UTF-8’;
    (注意:alter system set client_encoding=‘UTF-8’; 无法执行)

数据库会话中的参数(会话级)

  1. set client_encoding=‘UTF-8’;
  2. set client_encoding to ‘UTF-8’;
  3. set names ‘UTF-8’;
  4. alter session set client_encoding = ‘UTF8’;

gsql元命令(会话级)

  1. \encoding UTF-8

驱动连接参数

  1. libpq
conninfo = "dbname=postgres port=26100 host='192.168.56.117' client_encoding='UTF-8' application_name=test connect_timeout=5 sslmode=disable user='xxx' password='xxx' ";
  1. jdbc
urlString = "jdbc:opengauss://192.168.56.117:26100/postgres?batchMode=off&allowEncodingChanges=true&characterEncoding=GBK";
  1. psycopg2
conn = psycopg2.connect(database="postgres", user="xxx", password="xxx", host="192.168.56.117", port="26100",client_encoding="GBK")

postgresql.conf

client_encoding= 'UTF8'

(注:由于设置postgresql.conf的方式在我测试的各种情况下均未产生影响,为节省篇幅,下文不再列出这种方式)

各客户端中取值的优先级和默认值

由于可以设置的方式太多,那么必然会出现各个设置互相冲突时,以哪个为准的问题。
首先明确一点,当前会话执行的客户端字符编码,一定是可以通过
show client_encoding; 这个命令查看的,也就是说,无论怎么设置,最终都是为了影响会话里的 client_encoding 参数。接着,我们可以进行各种组合尝试,来确认这个参数的默认值及获取来源
image

根据以上测试结果,可以得到如下几个结论
对于gsql

  1. 不论数据库字符编码为何值,其client_encoding会从PGCLIENTENCODING获取
  2. 当PGCLIENTENCODING没有设置时,会从环境变量LC_CTYPE获取
  3. 当LC_CTYPE没有设置时,会从环境变量LC_ALL获取
  4. 当LC_ALL没有设置时,会从环境变量LANG获取
  5. 当LANG没有设置时(unset LANG),默认为sql_ascii
no
no
no
no
no
yes
yes
yes
yes
gsql
client_encoding 是否有在会话中设置
PGCLIENTENCODING 是否有设置
LC_CTYPE 是否有设置
LC_ALL是否有设置
LANG是否有设置
client_encoding 为 SQL_ASCII
client_encoding 取LC_ALL 的值
client_encoding 取LC_CTYPE 的值
client_encoding 取PGCLIENTENCODING 的值
client_encoding 为设定的值

对于libpq

  1. 不论LANG为何值,其client_encoding会从PGCLIENTENCODING获取
  2. 当PGCLIENTENCODING没有设置时,会从database的client_encoding获取(select * from pg_catalog.pg_db_role_setting )
  3. 当database的client_encoding没有设置时,默认为数据库建库时的字符编码(select getdatabaseencoding();)
no
no
no
yes
yes
yes
libpq
client_encoding 是否有在会话中设置
PGCLIENTENCODING 是否有设置
pg_catalog.pg_db_role_setting 是否有设置client_encoding
getdatabaseencoding
pg_catalog.pg_db_role_setting 的client_encoding
client_encoding 取PGCLIENTENCODING 的值
client_encoding 为设定的值

简单来说,就是libpq不认LANG、LC_CTYPE,gsql不认alter database和数据库字符编码。在不修改应用程序代码时,想指定客户端字符编码,最佳方式为设置PGCLIENTENCODING,因为这样才能保证两者的表现一致。

以上同样的测试,我用psycopg2jdbc也测了一遍,和libpq的表现是完全一致的,也就是说,设定PGCLIENTENCODING对各种程序开发是最通用的设定客户端字符集编码的方案。(单一程序处理多种字符编码的情况本文暂不考虑)

其他

附上我用libpq测试之前文章中的用例结果,可以发现能插入的结果和ORACLE表现是完全一致的,有区别的是,ORACLE中字符编码错了可能也能插入,而MogDB/openGauss/postgresql中则会报错,这个点是好是坏,也只能见仁见智,区分场景了。但我个人偏向于应尽量避免让错误的数据进入数据库
image-1675252053480

本文结论为参考了各种官方文档,加上自己的测试得到的结果,如有不对,请联系我指出。

参考链接

https://docs.mogdb.io/zh/mogdb/v3.0/character-set-support
https://docs.mogdb.io/zh/mogdb/v3.0/1-gsql
http://postgres.cn/docs/13/libpq-connect.html

  • 本文作者: DarkAthena
  • 本文链接: https://www.darkathena.top/archives/about-opengauss-client-encoding
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!

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

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

相关文章

磨金石教育摄影技能干货分享|年味就是幸福圆满的味道

时光荏苒,时代变迁。以前是古街古巷,现在是高楼大厦。以前的老街,灯笼满街,烟火气十足。现在的城市商业街中霓虹灯可以展示出各种新年的影像。无论时代如何变迁,无论时光走了多远,我们对春节的期待从未改变…

吴恩达机器学习(二)——机器学习之监督模型之回归模型之线性回归模型

y-hat一般指的就是预测值 线性回归模型实例 构建模型 我们有一个房子的大小size,得到房屋价格(price),通过这两个常数就可计算一个输入和输出的函数关系。 f w,b(x(i)) wx(i) b i指的是第几个训练数据 评估模型——…

【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用

【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用 配置依赖 <!-- 代理 配合 selenium进行抓包修改等 --><dependency><groupId>net.lightbody.bmp</groupId><artifactId>browsermob-core</artifactId><version>2.1.5&…

H3C Switch S1848G端口限速

需求&#xff1a;在交换机层面对接入用户的网络流量限速1.交换机信息2.主机限速前2.1本机IP和MAC信息依次打开控制面板\所有控制面板项\网络连接2.2限速前测速使用浏览器打开https://10000.gd.cn/测速3.主机限速后3.1查看主机所在交换机接口点击“网络”-“MAC地址”&#xff0…

【微信小程序】给你的页面加上一个填写进度表

前言在搭建一些与申请相关的微信小程序的时候&#xff0c;用户会遇到需要填写很多表单的情况&#xff0c;面对未知的表单数量&#xff0c;用户往往就会放弃填写申请表格。在此基础上作为开发者的我们常常会收到这样的一个任务——给申请页面加上一个填写进度表。这样不仅可以优…

274. H 指数

274. H 指数一、题目描述二、题目分析三、解题思路3.1 更换H指数定义3.2 二分法枚举H指数一、题目描述 二、题目分析 这道题比较绕&#xff0c;理解题目意思&#xff0c;根据题目的说法&#xff0c;所谓的H指数就是&#xff1a;总共有 h 篇论文分别被引用了至少 h 次。且其余的…

二战阿里巴巴成功上岸,准备了小半年,要个28k应该也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;阿里的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

Spring Cloud Alibaba系列三:集成Gateway实现路由管理

文章目录Spring Cloud Alibaba系列三&#xff1a;集成Gateway实现路由管理前言1、改造父项目 pom 文件2、创建 gateway 子 module3、配置yml文件Spring Cloud Alibaba系列三&#xff1a;集成Gateway实现路由管理 spring cloud alibaba 版本对照 spring cloud alibaba 有严格的…

【MPP数据库】TiDB表分区探索与实践

方案背景——为什么要进行分区&#xff1f; 一是老板通Tidb集群每天涉及50张表、2亿多条数据回流&#xff0c;合理使用Hash可以把写入压力打散到不同的TiKV&#xff1b; 二是对于大集团数据做聚合&#xff0c;利用分区裁剪原理&#xff0c;查询时可以充当前置索引&#xff0c…

1月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年1月23日-1月29日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

卫星地图——MAP(c++)

卫星地图 题目描述 一张矩形的卫星地图&#xff0c;有M行N列。行列中的0表示空地&#xff0c;1表示有建筑。有3种类型的建筑: L型: 仅在一行上占据连续的若干个格子&#xff0c;长度至少为2&#xff0c;至多为N C型&#xff1a;仅在一列上占据连续的若干个格子&#xff0c;…

春节机票销售大增!航空领域哪些业务风险要注意?

目录 航空领域常见的业务风险 2022年航空业务风险趋势分析 航空领域业务风险欺诈分析 如何防范航空业务风险 针对恶意网络爬虫 针对仿冒登录与内控风险 安全技术 春节旅游与出行数据陆续出炉。中国民航局数据显示&#xff0c;2023年1月21日至27日&#xff08;农历除夕至…

Linux - Linux系统

一、Linux系统Linux&#xff0c;全称GNU/Linux。Linux是一个开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发能力已经得到业界的认可&#xff0c;目前大多数企业级应用甚至是集群项目都部署运行在linux操作系统之上&#xff0c;很多软件公司考虑到开发成本都首选…

CnOpenData中国核酸检测机构及采样点数据

一、数据简介 2020年1月21日&#xff0c;国家卫健委发布1号公告&#xff0c;将新型冠状病毒感染的肺炎纳入《中华人民共和国传染病防治法》规定的乙类传染病&#xff0c;并采取甲类传染病的预防、控制措施。目前&#xff0c;新型冠状病毒肺炎防控仍处于关键阶段&#xff0c;核酸…

ThinkPHP6 文件上传

内置文件上传使用\think\facade\Filesystem类封装方法 目录 简单上传 public存储文件 文件验证 命名规则 使用sha1 使用MD5 使用date 指定文件名称 自定义命名规则 更多上传设置 总结 简单上传 直接上传&#xff0c;使用默认上传设置 $savename \think\facade\F…

业务平台扩展支持TDengine时序数据库方案

1 场景与架构 1.1业务架构 这里涉及项目隐私&#xff0c;架构图不方便公开。 大致情况就是&#xff1a; 应用层的园区畅行、生态宜居、安全守护是我方要交付的系统。 平台层的物联网感知中台是我方平台。 1.2数据架构 从数据架构看&#xff0c;园区畅行…

第四章 git分支操作

4.1什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时 候&#xff0c;不会影响主线分支的运行。对于初…

优化器-RBO 的规则转化

一、RBO 背景介绍RBO&#xff08;Rule-Based Optimization&#xff0c;基于规则的优化器&#xff09;有着一套严格的使用规则&#xff0c;按照 RBO 去写 SQL 语句&#xff0c;无论数据表中的内容怎样&#xff0c;也不会影响到你的“执行计划”。换言之 RBO 对数据不“敏感”&am…

码元,码元速率,波特率,比特率(个人理解总结)

参考&#xff1a;https://baike.baidu.com/item/%E7%A0%81%E5%85%83%E4%BC%A0%E8%BE%93%E9%80%9F%E7%8E%87/6305673 https://baike.baidu.com/item/%E7%A0%81%E5%85%83%E9%80%9F%E7%8E%87/10945076 https://baike.baidu.com/item/%E6%9B%BC%E5%BD%BB%E6%96%AF%E7%89%B9%E7%BC%9…

低代码:如何成为企业业务价值提升的一大利器?

首先&#xff0c;来看低代码能为企业带来什么&#xff1f; 低代码开发能够增加软件所创造的价值&#xff0c;帮助企业机构衡量企业级低代码平台的价值并计算它将会产生的影响。 低代码在企业的现实运用中能为企业带来巨大的经济效益。众所周知&#xff0c;软件可以推动业务价值…