文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

写入不合法字符报错

可获得性

本特性自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

Copyright © 2011-2024 www.enmotech.com All rights reserved.