可获得性
本特性自MogDB 5.0.2版本开始引入。
特性简介
支持在服务端和客户端字符集编码一致时,针对输入的数据不符合编码规则的情况进行报错。
客户价值
输出非法字符集报错信息,方便用户及时修复故障,保证系统正常运行。
特性描述
当前在服务端和客户端编码一致时,通过JDBC等方式写入的数据,如果出现非法字符,会被默认修改为 ‘?’ 存储,且没有提示信息,导致实际写入数据与期望数据不匹配。
MogDB 5.0.2版本新增session级别USERSET类型参数emit_illegal_bind_chars,用于控制是否针对不合法字符进行报错。该参数默认值为off,兼容旧版本行为(不报错)。修改参数值为on,即可开启报错功能。
特性约束
本特性仅涉及在服务端和客户端字符集一致的情况下,通过JDBC等客户端里PBE模式执行且参数个数大于0,参数中出现非法字符时报错,以下情形不在此特性范围内:
- 字符集一致,但参数个数为0,针对语句中出现的非法字符,目前行为已经是报错
- 通过gsql等方式执行的语句,目前行为已经是报错
- copy语句的行为由COMPATIBLE_ILLEGAL_CHARS控制,不在此特性范围内
- 服务端和客户端字符集不一致时,是否报错由转换函数决定,不在此特性范围内
示例
创建测试数据库、表,用以后续的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
相关页面
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




