diff --git a/.example/other/test.go b/.example/other/test.go index 12a299206..233938c85 100644 --- a/.example/other/test.go +++ b/.example/other/test.go @@ -3,12 +3,10 @@ package main import ( "fmt" "github.com/gogf/gf/encoding/gjson" - "math" ) func main() { body := "{\"id\": 413231383385427875}" - fmt.Println(math.MaxFloat32) if dat, err := gjson.DecodeToJson(body); err == nil { fmt.Println(dat.MustToJsonString()) } diff --git a/database/gdb/gdb_core.go b/database/gdb/gdb_core.go index 91f203499..dd80be6fc 100644 --- a/database/gdb/gdb_core.go +++ b/database/gdb/gdb_core.go @@ -734,9 +734,11 @@ func (c *Core) rowsToResult(rows *sql.Rows) (Result, error) { columnTypes[k] = v.DatabaseTypeName() columnNames[k] = v.Name() } - values := make([]sql.RawBytes, len(columnNames)) - records := make(Result, 0) - scanArgs := make([]interface{}, len(values)) + var ( + values = make([]sql.RawBytes, len(columnNames)) + records = make(Result, 0) + scanArgs = make([]interface{}, len(values)) + ) for i := range values { scanArgs[i] = &values[i] } diff --git a/database/gdb/gdb_func.go b/database/gdb/gdb_func.go index 4354c2a52..7b8b52b09 100644 --- a/database/gdb/gdb_func.go +++ b/database/gdb/gdb_func.go @@ -248,6 +248,9 @@ func GetPrimaryKeyCondition(primary string, where ...interface{}) (newWhereCondi // The internal handleArguments function might be called twice during the SQL procedure, // but do not worry about it, it's safe and efficient. func formatSql(sql string, args []interface{}) (newQuery string, newArgs []interface{}) { + sql = gstr.Trim(sql) + sql = gstr.Replace(sql, "\n", " ") + sql, _ = gregex.ReplaceString(`\s{2,}`, ` `, sql) return handleArguments(sql, args) } diff --git a/database/gdb/gdb_structure.go b/database/gdb/gdb_structure.go index dc7c23154..a64f5f784 100644 --- a/database/gdb/gdb_structure.go +++ b/database/gdb/gdb_structure.go @@ -25,22 +25,47 @@ func (c *Core) convertValue(fieldValue []byte, fieldType string) interface{} { t, _ := gregex.ReplaceString(`\(.+\)`, "", fieldType) t = strings.ToLower(t) switch t { - case "binary", "varbinary", "blob", "tinyblob", "mediumblob", "longblob": + case + "binary", + "varbinary", + "blob", + "tinyblob", + "mediumblob", + "longblob": return fieldValue - case "int", "tinyint", "small_int", "smallint", "medium_int", "mediumint": + case + "int", + "tinyint", + "small_int", + "smallint", + "medium_int", + "mediumint", + "serial", + "smallmoney": if gstr.ContainsI(fieldType, "unsigned") { gconv.Uint(string(fieldValue)) } return gconv.Int(string(fieldValue)) - case "big_int", "bigint": + case + "big_int", + "bigint", + "bigserial", + "money": if gstr.ContainsI(fieldType, "unsigned") { gconv.Uint64(string(fieldValue)) } return gconv.Int64(string(fieldValue)) - case "float", "double", "decimal": + case "real": + return gconv.Float32(string(fieldValue)) + + case + "float", + "double", + "decimal", + "numeric": return gconv.Float64(string(fieldValue)) case "bit": @@ -61,17 +86,19 @@ func (c *Core) convertValue(fieldValue []byte, fieldType string) interface{} { t, _ := gtime.StrToTime(string(fieldValue)) return t.Format("Y-m-d") - case "datetime", "timestamp": + case + "datetime", + "timestamp": t, _ := gtime.StrToTime(string(fieldValue)) return t.String() default: // Auto detect field type, using key match. switch { - case strings.Contains(t, "text") || strings.Contains(t, "char"): + case strings.Contains(t, "text") || strings.Contains(t, "char") || strings.Contains(t, "character"): return string(fieldValue) - case strings.Contains(t, "float") || strings.Contains(t, "double"): + case strings.Contains(t, "float") || strings.Contains(t, "double") || strings.Contains(t, "numeric"): return gconv.Float64(string(fieldValue)) case strings.Contains(t, "bool"):