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{
 | 
			
		||||
	Name:        "convert",
 | 
			
		||||
	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,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -35,17 +35,22 @@ func runConvert(ctx *cli.Context) error {
 | 
			
		|||
	log.Info("Log path: %s", setting.Log.RootPath)
 | 
			
		||||
	log.Info("Configuration file: %s", setting.CustomConf)
 | 
			
		||||
 | 
			
		||||
	if !setting.Database.Type.IsMySQL() {
 | 
			
		||||
		fmt.Println("This command can only be used with a MySQL database")
 | 
			
		||||
		return nil
 | 
			
		||||
	switch {
 | 
			
		||||
	case setting.Database.Type.IsMySQL():
 | 
			
		||||
		if err := db.ConvertUtf8ToUtf8mb4(); err != nil {
 | 
			
		||||
			log.Fatal("Failed to convert database from utf8 to utf8mb4: %v", err)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		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")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := db.ConvertUtf8ToUtf8mb4(); err != nil {
 | 
			
		||||
		log.Fatal("Failed to convert database from utf8 to utf8mb4: %v", err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4")
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,6 +42,33 @@ func ConvertUtf8ToUtf8mb4() error {
 | 
			
		|||
	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,
 | 
			
		||||
// and handles possible irregular cases.
 | 
			
		||||
func Cell2Int64(val xorm.Cell) int64 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue