非ASCII时,opengauss的工作流程如下:
(1)客户端的gsql直接发送字符串给服务器(假如为gbk)
(2)服务器端gaussdb接收后立即讲字符串从客户端编码(gbk)转为服务器端编码(假如为utf8)
(3)后续全部按照服务器端编码(utf8)进行解析。
但是编码为ASCII时是不会进行任何转换的,客户端发送什么就存储什么,这会引起问题。
比如客户端为utf8,服务器为ASCII时,
select to_number ('¥9987.65','9999.00');
会得到错误结果9987.6。
由于数据库中存储的结果可能是任何编码,在进行字符处理时,发生错误的概率几乎是一定的。
另外,在gaussdb端来进行字符编码转换可能会造成服务器端压力过大,如果由gsql来进行转码动作应该更合适,希望就编码问题进行讨论。
来自阿里邮箱Android客户端