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

MogDB 写入不合法字符报错

原创 MogDB 2024-08-06
239

可获得性

本特性自MogDB 5.0.2版本开始引入。

特性简介

支持在服务端和客户端字符集编码一致时,针对输入的数据不符合编码规则的情况进行报错。

客户价值

输出非法字符集报错信息,方便用户及时修复故障,保证系统正常运行。

特性描述

当前在服务端和客户端编码一致时,通过JDBC等方式写入的数据,如果出现非法字符,会被默认修改为 ‘?’ 存储,且没有提示信息,导致实际写入数据与期望数据不匹配。

MogDB 5.0.2版本新增session级别USERSET类型参数emit_illegal_bind_chars,用于控制是否针对不合法字符进行报错。该参数默认值为off,兼容旧版本行为(不报错)。修改参数值为on,即可开启报错功能。

特性约束

本特性仅涉及在服务端和客户端字符集一致的情况下,通过JDBC等客户端里PBE模式执行且参数个数大于0,参数中出现非法字符时报错,以下情形不在此特性范围内:

  1. 字符集一致,但参数个数为0,针对语句中出现的非法字符,目前行为已经是报错
  2. 通过gsql等方式执行的语句,目前行为已经是报错
  3. copy语句的行为由COMPATIBLE_ILLEGAL_CHARS控制,不在此特性范围内
  4. 服务端和客户端字符集不一致时,是否报错由转换函数决定,不在此特性范围内

示例

创建测试数据库、表,用以后续的DML语句使用。

CREATE DATABASE db_gbk TEMPLATE template0 encoding 'GBK' lc_ctype 'zh_CN.GBK' lc_collate 'zh_CN.GBK'; CREATE TABLE test (a integer,b character varying);

以Go为例,编写代码,连接到数据库,并执行DML语句。

package main import ( "database/sql" "encoding/hex" _ "github.com/lib/pq" ) func main() { db, err: = sql.Open("postgres", "port=5434 user=test password=Qwer1234 dbname=db_gbk sslmode=disable") checkErr(err) defer db.Close() _, err = db.Exec("set client_encoding = 'GBK'"); checkErr(err) _, err = db.Exec("set emit_illegal_bind_chars = on") checkErr(err) s: = "8139EF31" b, _: = hex.DecodeString(s) _, err = db.Exec("insert into test values ($1, $2)", 1, string(b)) checkErr(err) } func checkErr(err error) { if err != nil { panic(err) } }

执行报错:

panic: pq: invalid byte sequence for encoding "GBK": 0x81 0x39 goroutine 1 [running]: main.checkErr(...) /home/test/Documents/test_go/main.go:25 main.main() /home/test/Documents/test_go/main.go:20 +0x225

相关页面

emit_illegal_bind_chars

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

评论