mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Support converting varchar to nvarchar for mssql database (#24105)
This commit is contained in:
		| @@ -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 { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lunny Xiao
					Lunny Xiao