Gaea
Gaea copied to clipboard
prepare,exec方式代理导致decimal精度丢失
客æ·ç«¯éè¿gaea代ç访é®å端æ°æ®åºè¿è¡æ¥è¯¢æä½ï¼å¦æ使ç¨prepareï¼execæ¹å¼è¿è¡æä½ï¼ä¼å¯¼è´ç²¾åº¦ä¸¢å¤±é®é¢
å端æ°æ®åºçæ¬ï¼5.7.38 gaeaçæ¬ï¼latest 客æ·ç«¯ï¼go+gormè¿è¡æä½ æ°æ®åºå段类åï¼decimal(58,18)
éè¿gormè¿è¡ç´æ¥æ¥è¯¢ï¼ç»æ符åé¢æ
type TestModel struct {
Amount decimal.Decimal `gorm:"type:decimal(58,18);"`
}
func (t TestModel) TableName() string {
return "table1"
}
func Test_GORM(t *testing.T) {
dsn := "user:123456@tcp(127.0.0.1:13306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
tm := TestModel{}
db.Select("amount").Where("id = 10001").First(&tm)
fmt.Println(tm.Amount.String())
}
客æ·ç«¯æå°çç»æ为
11773175730.545026930000000051
ä¸é¢æ¯éè¿gorm+prepareï¼execæ¹å¼è¿è¡æ¥è¯¢
func Test_GORMPrepare(t *testing.T) {
dsn := "user:123456@tcp(127.0.0.1:13306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
tm := TestModel{}
db.Raw("select amount from table1 where id = ?", 10001).Scan(&tm)
fmt.Println(tm.Amount.String())
}
客æ·ç«¯æå°çç»æ为
11773175730.545027
第äºç§æ¹å¼ä½¿ç¨prepareï¼execæ¹å¼è¿è¡æ§è¡æ¥è¯¢ï¼ç»è¿æå åæµè¯ï¼åç°å端è¿åç»gaeaæ¯ç²¾ç¡®çï¼ä½æ¯gaea对æ°æ®è¿è¡æ¼æ¥çæ¶åï¼è½¬æ¢ä¸ºfloatï¼å¯¼è´ç²¾åº¦ä¸¢å¤±
导è´é®é¢çå ·ä½ä»£ç ä½ç½®ä¸º https://github.com/XiaoMi/Gaea/blob/master/mysql/result.go#L81
大佬们帮å¿è§£çä¸ï¼æ¯ä»£ç é®é¢ï¼è¿æ¯ä½¿ç¨æ¹å¼ä¸æ£ç¡®å¯¼è´æ¤é®é¢