go oracle 中文乱码,go中使用oracle出现科学计数法的详解

周辰沛
2023-12-01

解决go显示select结果为科学计数法的问题

sql语句如下:执行后,使用map集合传入前台,显示可能为科学计数法(这里为什么说可能,因为本地不会显示,但是在服务器和小关电脑上会显示,很奇怪,也不知道为什么)

SELECT dd.Name,

cc.待处理新增,

cc.待处理变更,

cc.待处理注销,

cc.已处理新增,

cc.已处理变更,

cc.已处理注销,

cc.本次特殊处理,

cc.永久特殊处理,

TO_CHAR (cc.合并异常)

FROM table1

改为如下SQL:先设定所有的字段类型为字符型,这样所有的显示就不会出现可续计数法

SELECT TO_CHAR (dd.Name),

TO_CHAR (cc.待处理新增),

TO_CHAR (cc.待处理变更),

TO_CHAR (cc.待处理注销),

TO_CHAR (cc.已处理新增),

TO_CHAR (cc.已处理变更),

TO_CHAR (cc.已处理注销),

TO_CHAR (cc.本次特殊处理),

TO_CHAR (cc.永久特殊处理),

TO_CHAR (cc.合并异常)

FROM table1

问题猜疑:可能是字符集的问题,但是只是电脑不同,所以也可能是环境的问题,很难解决

问题探索:

新设计代码,使用三种不同类型接收

package main

import (

"database/sql"

"log"

)

func main() {

db, err := sql.Open("oci8", "tjbm/tjbm")

if err != nil {

panic(err)

}

if err != nil {

panic(err)

}

defer db.Close()

var aa sql.NullString

var bb sql.NullFloat64

var cc sql.NullInt64

var dd sql.NullString

row, err := db.Query(`

SELECT sum(aa),

sum(bb),

sum(cc),

sum(dd),

FROM table`)

if err != nil {

panic(err)

}

for row.Next() {

if err := row.Scan(&aa, &bb, &cc, &dd); err != nil {

panic(err)

}

log.Println(aa, bb, cc, dd)

}

defer row.Close()

}

首次执行发现,数据都能接收,这时候发现执行结果为:

2019/03/19 16:18:19 {广西壮族自治区 true} {2000 true} {0 true} {11 true}

是不是就没错误了呢~非也!!!

给SQL中值增加,值超过六位数,这里不用真的去数据库插入那么多数据,可以使用then语句条件判断,如果符合,返回1000,和sum一起用就好了

SUM (

CASE

WHEN b.变动类型 = '1'

AND b.待处理 = '1'

THEN

1

END)

AS 待处理新增,

这时候发现运行报错:

time=20190319T163404 level=info msg="执行统计赋值出错 sql: Scan error on column index 1, name \"待处理新增\": converting driver.Value type float64 (\"1.936e+06\") to a int64: invalid syntax"

这时候发现,当数值超过6位数,就形成了科学计数法,这时候,把int64 去接收有小数的float,就会报错,同时,也侧面描述了select中的值是float类型的返回。

 类似资料: