VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

处理数据类型

二进制类型

Vastbase G100提供两种不同的方法存储二进制数据。 二进制数据可以使用二进制数据类型 BYTEA存储在表中,或者使用大对象特性以一种特殊的格式将二进制数据存储在一个独立的表中, 然后通过在表中保存一个类型为 OID 的值来引用该表。以下为这两种方法的使用示例。

  • 使用BYTEA类型存储

    1、创建表。

    engine.Exec("create table lo_test_tab (id int, img bytea)")
    

    2、插入数据。

    file,_ := os.Open("image.png")
    defer file.Close()
    bytes,_ := ioutil.ReadAll(file)
    engine.Exec("insert into lo_test_values(1,?)",bytes)
    

    3、读取数据。

    Bytedata,_ := engine.Query("select img from lo_test_tab where id=1")
    _ = IfNoFileToCreate("newimage.png")
    if err := ioutil.WriteFile("newimage.png",bytedata[0]["img"],0666);err !=nil{
        fmt.Println("写入文件失败")
    }
    
  • 使用OID存储

    1、创建表。

    engine.Exec("create table lo_test_tab (name text, img oid)")
    

    2、导入数据。

    该步骤会将操作系统文件“image”导入成一个大对象并生成一个oid,查询lo_test_tab表时则显示oid。

    engine.Exec("insert into  lo_test_tab values('beautiful image', lo_import('/tmp/image'))")
    

    3、导出数据。

    该操作将数据库中存储的大对象导出到一个操作系统文件。

    engine.Exec("select lo_export(lo_test_tab.img, '/tmp/image-bak') from lo_test_tab where name = 'beautiful image'")
    

字符类型

Vastbase G100中TEXT类型与VARCHAR类型都是可变长的字符类型,区别在于VARCHAR类型通过VARCHAR(n)中的n来限制最大长度,而TEXT类型没有。TEXT类型与VARCHAR类型几乎没有性能差别,TEXT类型最多可存储1G数据 。

使用TEXT类型存储数据时,可用以下方式来进行读写。

1、创建表。

engine.Exec("create table images (id int, msg text)")

2、插入数据。

engine.Exec("insert into images values(1, ?)" ("the text data"))

3、读取数据。

result,err := engine.QueryString("select msg from images where id = 1")
fmt.Println(result[0]["img"])

数字类型

数字类型有整数类型、任意精度数字类型、浮点类型和序数类型。下面用整数类型integer、任意精度数字类型numeric、 浮点类型real和double precision举例说明。

1、创建表。

  • 整数类型integer的建表:

    type test_int struct{
            Num int
    }
    engine.Sync2(new(test_int))
    
  • 任意精度数字类型numeric的建表:

    type test_numeric struct{
            Num string
    }
    engine.Exec("create table test_numeric(num numeric)")
    
  • 浮点类型real和double precision的建表:

    # real类型
    type test_real struct{
            Num string
    }
    engine.Exec("create table test_real(num real)")
    # double precision类型
    type test_doubleprecision struct{
            Num string
    }
    engine.Exec("create table test_doubleprecision(num double precision)")
    

2、插入数据。

  • 整数类型integer的插入:

    temp := new(test_int)
    Temp.Num=3
    affected,err := engine.Insert(temp)
    Fmt.Println("affected,err")
    
  • 任意精度数字类型numeric的插入:

    temp := new(test_numeric)
    Temp.Num="123.456"
    affected,err := engine.Insert(temp)
    Fmt.Println("affected,err")
    
  • 浮点类型real和double precision的插入:

    # real类型
    temp := new(test_real)
    Temp.Num=3.1234
    affected,err := engine.Insert(temp)
    Fmt.Println("affected,err")
    # double precision类型
    temp := new(test_doubleprecision )
    Temp.Num=4.1234
    affected,err := engine.Insert(temp)
    Fmt.Println("affected,err")
    

3、读取数据。

  • 整数类型integer的读取:

    tmp := new(test_int)
    rc,_ := engine.Get(tmp)
    fmt.Println(tmp.Num)
    fmt.Println(rc)
    
  • 任意精度数字类型numeric的读取:

    tmp := new(test_numeric)
    rc,_ := engine.Get(tmp)
    fmt.Println(tmp.Num)
    fmt.Println(rc)
    
  • 浮点类型real和double precision的读取:

    # real类型
    tmp := new(test_real)
    rc,_ := engine.Get(tmp)
    fmt.Println(tmp.Num)
    fmt.Println(rc)
    # double precision类型
    tmp := new(test_doubleprecision)
    rc,_ := engine.Get(tmp)
    fmt.Println(tmp.Num)
    fmt.Println(rc)
    

时间/日期类型

日期/时间类型有timestamp 、date、time 、interval ;下面以timestamp 、date、time 举例说明。

1、创建表。

engine.Exec("create table images (id int, msg text)")
# timestamp类型
type test_timestamp struct{
		Dt time.Time
}
engine.Exec("create table test_timestamp(dt timestamp)")
# date类型
type test_date struct{
		Dt time.Time
}
engine.Exec("create table test_date(dt date)")
# time类型
type test_time struct{
		Dt time.Time
}
engine.Exec("create table test_time(dt time)")

2、插入数据。

# timestamp类型
temp := new(test_timestamp)
temp.Dt= time.Date(2018,10,1,10,30,30,0,time.Local)
engine.Insert(temp)
# date类型
temp := new(test_date)
temp.Dt= time.Date(2018,10,1,0,0,0,time.Local)
engine.Insert(temp)
# time类型
temp := new(test_time)
temp.Dt= time.Date(1,1,1,10,10,10,time.Local)
engine.Insert(temp)

3、读取数据。

# timestamp类型
tmp := new(test_timestamp)
rc,_ := engine.Get(tmp)
fmt.Println(tmp.Dt)
fmt.Println(rc)
# date类型
tmp := new(test_date)
rc,_ := engine.Get(tmp)
fmt.Println(tmp.Dt.Year(),tmp.Dt.Month(),tmp.Dt.Day())
fmt.Println(rc)
# time类型
tmp := new(test_time)
rc,_ := engine.Get(tmp)
fmt.Println(tmp.Dt.Hour(),tmp.Dt.Minute(),tmp.Dt.Second())
fmt.Println(rc)