处理数据类型
二进制类型
Vastbase G100提供两种不同的方法存储二进制数据。 二进制数据可以使用二进制数据类型 BYTEA存储在表中,或者使用大对象特性以一种特殊的格式将二进制数据存储在一个独立的表中, 然后通过在表中保存一个类型为 OID 的值来引用该表。以下为这两种方法的使用示例。
使用BYTEA类型存储
(1)创建表
stmt,err := db.Prepare("create table lo_test_tab (id int, img bytea)") res,err := stmt.Exec()
(2)插入数据
file,_ := os.Open("image.png") defer file.Close() bytes,_ := ioutil.ReadAll(file) stmt,err := db.Prepare("insert into lo_test_tab values(1,$1)") res,err := stmt.Exec(bytes)
(3)读取数据
var bytedata []byte err := db.QueryRow("select img from lo_test_tab where id=1").Scan(&bytedata) _ = IfNoFileToCreate("newimage.png") if err := ioutil.WriteFile("newimage.png",bytedata,0666);err !=nil{ fmt.Println("写入文件失败") }
使用OID存储
(1)创建表
stmt,err := db.Prepare("create table lo_test_tab (name text, img oid)") res,err := stmt.Exec()
(2)导入数据
该步骤会将操作系统文件“image”导入成一个大对象并生成一个oid,查询lo_test_tab表时则显示oid。
stmt,err := db.Prepare("insert into lo_test_tab values('beautiful image', lo_import('/tmp/image'))") res,err := stmt.Exec()
(3)导出数据
该操作将数据库中存储的大对象导出到一个操作系统文件。
stmt,err := db.Prepare("select lo_export(lo_test_tab.img, '/tmp/image-bak') from lo_test_tab where name = 'beautiful image'") res,err := stmt.Exec()
字符类型
Vastbase G100中TEXT类型与VARCHAR类型都是可变长的字符类型,区别在于VARCHAR类型通过VARCHAR(n)中的n来限制最大长度,而TEXT类型没有。TEXT类型与VARCHAR类型几乎没有性能差别,TEXT类型最多可存储1G数据 。
使用TEXT类型存储数据时,可用以下方式来进行读写。
(1)创建表
stmt,err := db.Prepare("create table images (id int, msg text)")
res,err := stmt.Exec()
(2)插入数据
stmt,err := db.Prepare("insert into images values(1, $1)")
res,err := stmt.Exec("the text data")
(3)读取数据
row,err := db.Query("select msg from images where id = 1")
for row.Next(){
var t string
err := row.Scan(&t)
fmt.Println(t)
fmt.Println(err)
}
数字类型
数字类型有整数类型、任意精度数字类型、浮点类型和序数类型。下面用整数类型integer、任意精度数字类型numeric、 浮点类型real和double precision举例说明。
(1)创建表
整数类型integer的建表
stmt,err := db.Prepare("create table test_int(Num int)") res,err := stmt.Exec()
任意精度数字类型numeric的建表
stmt,err := db.Prepare("create table test_numeric(num numeric)") res,err := stmt.Exec()
浮点类型real和double precision的建表
// real类型 stmt,err := db.Prepare("create table test_real(num real)") res,err := stmt.Exec() // double precision类型 stmt,err := db.Prepare("create table test_doubleprecision(num double precision)") res,err := stmt.Exec()
(2)插入数据
整数类型integer的插入
stmt,err := db.Prepare("insert into test_int values($1)") res,err := stmt.Exec(3)
任意精度数字类型numeric的插入
stmt,err := db.Prepare("insert into test_numeric values($1)") res,err := stmt.Exec(123.456)
浮点类型real和double precision的插入
// real类型 stmt,err := db.Prepare("insert into test_real values($1)") res,err := stmt.Exec(3.1234) // double precision类型 stmt,err := db.Prepare("insert into test_doubleprecision values($1)") res,err := stmt.Exec(4.1234)
(3)读取数据
整数类型integer的读取
type test_int struct{ Num int } row,err := db.Query("select Num from test_int") var i test_int for row.Next(){ err := row.Scan(&i.Num) fmt.Println(i.Num) }
任意精度数字类型numeric的读取
type test_numeric struct{ Num string } row,err := db.Query("select Num from test_numeric") var i test_numeric for row.Next(){ err := row.Scan(&i.Num) fmt.Println(i.Num) }
浮点类型real和double precision的读取
// real类型 type test_real struct{ Num string } row,err := db.Query("select Num from test_real ") var i test_real for row.Next(){ err := row.Scan(&i.Num) fmt.Println(i.Num) } // double precision类型 type test_doubleprecision struct{ Num string } row,err := db.Query("select Num from test_doubleprecision ") var i test_doubleprecision for row.Next(){ err := row.Scan(&i.Num) fmt.Println(i.Num) }
时间/日期类型
日期/时间类型有timestamp 、date、time 、interval ;下面以timestamp 、time 举例说明。
(1)创建表
// timestamp类型
type test_timestamp struct{
Dt time.Time
}
stmt,err := db.Prepare("create table test_timestamp(dt timestamp)")
res,err := stmt.Exec()
// time类型
type test_time struct{
Dt time.Time
}
stmt,err := db.Prepare("create table test_time(dt time)")
res,err := stmt.Exec()
(2)插入数据
// timestamp类型
stmt,err := db.Prepare("insert into test_timestamp values($1)")
res,err := stmt.Exec(time.Date(2018,10,1,10,30,30,0,time.Local))
// time类型
stmt,err := db.Prepare("insert into test_time values($1)")
res,err := stmt.Exec(time.Date(1,1,1,10,10,10,time.Local))
(3)读取数据
// timestamp类型
row,err := db.Query("select dt from test_timestamp")
var i test_timestamp
for row.Next(){
err := row.Scan(&i.Dt)
fmt.Println(i.Dt)
}
// time类型
row,err := db.Query("select dt from test_time")
var i test_time
for row.Next(){
err := row.Scan(&i.Dt)
fmt.Println(i.Dt.Hour(),i.Dt.Minute(),i.Dt.Second())
}