Skip to content

Commit cda84be

Browse files
authored
Support converting varchar to nvarchar for mssql database (#24105)
1 parent dcde470 commit cda84be

File tree

2 files changed

+43
-11
lines changed

2 files changed

+43
-11
lines changed

cmd/convert.go

+16-11
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
var CmdConvert = cli.Command{
1818
Name: "convert",
1919
Usage: "Convert the database",
20-
Description: "A command to convert an existing MySQL database from utf8 to utf8mb4",
20+
Description: "A command to convert an existing MySQL database from utf8 to utf8mb4 or MSSQL database from varchar to nvarchar",
2121
Action: runConvert,
2222
}
2323

@@ -35,17 +35,22 @@ func runConvert(ctx *cli.Context) error {
3535
log.Info("Log path: %s", setting.Log.RootPath)
3636
log.Info("Configuration file: %s", setting.CustomConf)
3737

38-
if !setting.Database.Type.IsMySQL() {
39-
fmt.Println("This command can only be used with a MySQL database")
40-
return nil
38+
switch {
39+
case setting.Database.Type.IsMySQL():
40+
if err := db.ConvertUtf8ToUtf8mb4(); err != nil {
41+
log.Fatal("Failed to convert database from utf8 to utf8mb4: %v", err)
42+
return err
43+
}
44+
fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4")
45+
case setting.Database.Type.IsMSSQL():
46+
if err := db.ConvertVarcharToNVarchar(); err != nil {
47+
log.Fatal("Failed to convert database from varchar to nvarchar: %v", err)
48+
return err
49+
}
50+
fmt.Println("Converted successfully, please confirm your database's all columns character is NVARCHAR now")
51+
default:
52+
fmt.Println("This command can only be used with a MySQL or MSSQL database")
4153
}
4254

43-
if err := db.ConvertUtf8ToUtf8mb4(); err != nil {
44-
log.Fatal("Failed to convert database from utf8 to utf8mb4: %v", err)
45-
return err
46-
}
47-
48-
fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4")
49-
5055
return nil
5156
}

models/db/convert.go

+27
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,33 @@ func ConvertUtf8ToUtf8mb4() error {
4242
return nil
4343
}
4444

45+
// ConvertVarcharToNVarchar converts database and tables from varchar to nvarchar if it's mssql
46+
func ConvertVarcharToNVarchar() error {
47+
if x.Dialect().URI().DBType != schemas.MSSQL {
48+
return nil
49+
}
50+
51+
sess := x.NewSession()
52+
defer sess.Close()
53+
res, err := sess.QuerySliceString(`SELECT 'ALTER TABLE ' + OBJECT_NAME(SC.object_id) + ' MODIFY SC.name NVARCHAR(' + CONVERT(VARCHAR(5),SC.max_length) + ')'
54+
FROM SYS.columns SC
55+
JOIN SYS.types ST
56+
ON SC.system_type_id = ST.system_type_id
57+
AND SC.user_type_id = ST.user_type_id
58+
WHERE ST.name ='varchar'`)
59+
if err != nil {
60+
return err
61+
}
62+
for _, row := range res {
63+
if len(row) == 1 {
64+
if _, err = sess.Exec(row[0]); err != nil {
65+
return err
66+
}
67+
}
68+
}
69+
return err
70+
}
71+
4572
// Cell2Int64 converts a xorm.Cell type to int64,
4673
// and handles possible irregular cases.
4774
func Cell2Int64(val xorm.Cell) int64 {

0 commit comments

Comments
 (0)