Support converting varchar to nvarchar for mssql database (#24105)
This commit is contained in:
parent
dcde4701a5
commit
cda84bec87
2 changed files with 43 additions and 11 deletions
|
@ -17,7 +17,7 @@ import (
|
||||||
var CmdConvert = cli.Command{
|
var CmdConvert = cli.Command{
|
||||||
Name: "convert",
|
Name: "convert",
|
||||||
Usage: "Convert the database",
|
Usage: "Convert the database",
|
||||||
Description: "A command to convert an existing MySQL database from utf8 to utf8mb4",
|
Description: "A command to convert an existing MySQL database from utf8 to utf8mb4 or MSSQL database from varchar to nvarchar",
|
||||||
Action: runConvert,
|
Action: runConvert,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,17 +35,22 @@ func runConvert(ctx *cli.Context) error {
|
||||||
log.Info("Log path: %s", setting.Log.RootPath)
|
log.Info("Log path: %s", setting.Log.RootPath)
|
||||||
log.Info("Configuration file: %s", setting.CustomConf)
|
log.Info("Configuration file: %s", setting.CustomConf)
|
||||||
|
|
||||||
if !setting.Database.Type.IsMySQL() {
|
switch {
|
||||||
fmt.Println("This command can only be used with a MySQL database")
|
case setting.Database.Type.IsMySQL():
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := db.ConvertUtf8ToUtf8mb4(); err != nil {
|
if err := db.ConvertUtf8ToUtf8mb4(); err != nil {
|
||||||
log.Fatal("Failed to convert database from utf8 to utf8mb4: %v", err)
|
log.Fatal("Failed to convert database from utf8 to utf8mb4: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4")
|
fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4")
|
||||||
|
case setting.Database.Type.IsMSSQL():
|
||||||
|
if err := db.ConvertVarcharToNVarchar(); err != nil {
|
||||||
|
log.Fatal("Failed to convert database from varchar to nvarchar: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Println("Converted successfully, please confirm your database's all columns character is NVARCHAR now")
|
||||||
|
default:
|
||||||
|
fmt.Println("This command can only be used with a MySQL or MSSQL database")
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,33 @@ func ConvertUtf8ToUtf8mb4() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConvertVarcharToNVarchar converts database and tables from varchar to nvarchar if it's mssql
|
||||||
|
func ConvertVarcharToNVarchar() error {
|
||||||
|
if x.Dialect().URI().DBType != schemas.MSSQL {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
sess := x.NewSession()
|
||||||
|
defer sess.Close()
|
||||||
|
res, err := sess.QuerySliceString(`SELECT 'ALTER TABLE ' + OBJECT_NAME(SC.object_id) + ' MODIFY SC.name NVARCHAR(' + CONVERT(VARCHAR(5),SC.max_length) + ')'
|
||||||
|
FROM SYS.columns SC
|
||||||
|
JOIN SYS.types ST
|
||||||
|
ON SC.system_type_id = ST.system_type_id
|
||||||
|
AND SC.user_type_id = ST.user_type_id
|
||||||
|
WHERE ST.name ='varchar'`)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, row := range res {
|
||||||
|
if len(row) == 1 {
|
||||||
|
if _, err = sess.Exec(row[0]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Cell2Int64 converts a xorm.Cell type to int64,
|
// Cell2Int64 converts a xorm.Cell type to int64,
|
||||||
// and handles possible irregular cases.
|
// and handles possible irregular cases.
|
||||||
func Cell2Int64(val xorm.Cell) int64 {
|
func Cell2Int64(val xorm.Cell) int64 {
|
||||||
|
|
Loading…
Reference in a new issue