暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

openGauss创建视图报0xef 0x2c 0x63问题分析与处理

原创 尚雷 2022-11-28
1174

注:问题虽然解决了,但问题出现的原因,我还是有些困惑,希望对此熟悉的大牛能帮忙解惑下,万分感谢。

一、现象描述

在跟进墨天轮的openGauss在线实训课程学习熟悉gsql命令时,使用\dv 命令想查看当前数据库的视图信息,发现当前数据库没有视图信息,于是就尝试手工创建一个视图,产生报错,报错信息是ERROR: invalid byte sequence for encoding “UTF8”: 0xef 0x2c 0x63:

image.png

presdb=# presdb=# \dv
No relations found.
presdb=# \c postgres 
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "postgres" as user "omm".
openGauss=# \dv
No relations found.

presdb=# \d bmsql_config
          Table "public.bmsql_config"
  Column   |         Type          | Modifiers 
-----------+-----------------------+-----------
 cfg_name  | character varying(30) | not null
 cfg_value | character varying(50) | 
Indexes:
    "bmsql_config_pkey" PRIMARY KEY, btree (cfg_name) TABLESPACE pg_default
Tablespace: "tbs2"

presdb=# create view bmsql_config_view as select cfg_name,cfg_value from bmsql_config;
ERROR:  invalid byte sequence for encoding "UTF8": 0xef 0x2c 0x63
presdb=# show client_encoding;
 client_encoding 
-----------------
 UTF8
(1 row)
复制

二、原因分析

我很好奇为什么会产生这种报错信息呢,这种报错信息代表什么意思呢,于是查询了相关资料。根据资料信息,提示invalid byte sequence for encoding “UTF8”: 0xef 0x2c 0x63:是postgreSQL独有的错误信息,有以下三种情形可能会出现此报错,分别是:

  1. client_encoding和server_encoding未设置为UTF8。
  2. 文件正在使用其他字符集。
  3. 文件包含反斜杠“\”,但未用作转义字符串。

openGauss源于postgreSQL,在默认情况下,postgreSQL是不进行字符集转换的,如果一个数据库字符集是UTF8,而进行操作的终端工具(如SecureCRT等)字符集设置的是中文(如GBK或GB18030等),则输入的是非UTF8编码,该编码会不经转换的存入数据库中,而数据库设置的是UTF8,两者在编码转换时产生问题,导致报错。

我查询了我当前操作的SecureCRT工具,当前SecureCRT设置的字符集是UTF-8,如下图所示:

image.png

数据库服务器上当前数据库client_encoding及server_encoding均是UTF8,如下所示:

[omm@opengauss-node1 ~]$ gsql -d presdb -p 26000
gsql ((openGauss 3.1.0 build 4e931f9a) compiled at 2022-09-29 14:19:24 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

presdb=# show client_encoding;
 client_encoding 
-----------------
 UTF8
(1 row)

presdb=# show server_encoding;
 server_encoding 
-----------------
 UTF8
(1 row)
复制

image.png

那当前报错原因就不属于以上常用报错原因的第一种。

该语句是我从notepad上通过鼠标复制粘贴到SecureCRT上执行的,未通过文件执行,也不符合通常报错的第二个原因。

我查询网上一些解决办法的资料,设置\encoding GBK并重新执行了创建视图语句,这次创建成功了。


presdb=# \encoding GBK
presdb=# create view bmsql_config_view as select cfg_name,cfg_value from bmsql_config;
CREATE VIEW
presdb=# \dv
                  List of relations
 Schema |       Name        | Type | Owner | Storage 
--------+-------------------+------+-------+---------
 public | bmsql_config_view | view | omm   | 
(1 row)
复制

image.png

三、再次验证

3.1 设置SecureCRT字符集为GB18030测试

问题虽然解决了,但具体是哪个环节出现了问题,我仍然感到有些困惑,于是我又尝试做了几个实验。

首先我将SecureCRT工具字符集设置

image.png

[omm@opengauss-node1 ~]$ gsql -d presdb -p 26000
gsql ((openGauss 3.1.0 build 4e931f9a) compiled at 2022-09-29 14:19:24 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

presdb=# show client_encoding;
 client_encoding 
-----------------
 UTF8
(1 row)

presdb=# show server_encoding;
 server_encoding 
-----------------
 UTF8
(1 row)

presdb=# drop view bmsql_config_view;
DROP VIEW
presdb=# create view bmsql_config_view as select cfg_name,cfg_value from bmsql_config;
CREATE VIEW
presdb=# \dv
                  List of relations
 Schema |       Name        | Type | Owner | Storage 
--------+-------------------+------+-------+---------
 public | bmsql_config_view | view | omm   | 
(1 row)
presdb=# select * from bmsql_config_view;
  cfg_name   | cfg_value 
-------------+-----------
 warehouses  | 1
 nURandCLast | 86
 nURandCC_ID | 467
 nURandCI_ID | 6575
(4 rows)
复制

image.png

通过以上试验可以看到视图正常被创建,未出现开头的报错现象,另外我又尝试将SecureCRT字符集设置为GB2312,仍然可以正常创建视图。

3.1 设置client_encoding为GBK测试

这次我重新将SecureCRT字符集设置为UTF8,但将client_encoding设置为GBK进行测试,以下是测试过程和结果。

image.png

[root@opengauss-node1 ~]# su - omm
Last login: Mon Nov 28 09:50:00 CST 2022 on pts/5
[omm@opengauss-node1 ~]$ gsql -d presdb -p 26000
gsql ((openGauss 3.1.0 build 4e931f9a) compiled at 2022-09-29 14:19:24 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

presdb=# show client_encoding;
 client_encoding 
-----------------
 UTF8
(1 row)

presdb=# show server_encoding;
 server_encoding 
-----------------
 UTF8
(1 row)

presdb=# set client_encoding = 'GBK';
SET
presdb=# show client_encoding;
 client_encoding 
-----------------
 GBK
(1 row)

presdb=# drop view bmsql_config_view;
DROP VIEW
presdb=# create view bmsql_config_view as select cfg_name,cfg_value from bmsql_config;
CREATE VIEW
presdb=# \dv           
                  List of relations
 Schema |       Name        | Type | Owner | Storage 
--------+-------------------+------+-------+---------
 public | bmsql_config_view | view | omm   | 
(1 row)

presdb=# select * from bmsql_config_view;
  cfg_name   | cfg_value 
-------------+-----------
 warehouses  | 1
 nURandCLast | 86
 nURandCC_ID | 467
 nURandCI_ID | 6575
(4 rows)
复制

image.png

通过上述实验,可以看到仍然能正常创建视图,为产生报错。

至此,我更困惑了,到底是什么环节出现了问题,希望对此方面熟悉的帮忙解惑下。

最后修改时间:2022-11-29 11:40:20
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

暂无图片
获得了1次点赞
暂无图片
内容获得2次评论
暂无图片
获得了1次收藏
TA的专栏
崖山数据库
收录2篇内容
kingbaseES
收录2篇内容
ClickHouse
收录11篇内容
目录
  • 一、现象描述
  • 二、原因分析
  • 三、再次验证
    • 3.1 设置SecureCRT字符集为GB18030测试
    • 3.1 设置client_encoding为GBK测试