diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8da2ffd88af99dcc777bfc5e9a2fb219542b9364..0b45cfe7500e66c5b8b97bc321b7523542080b19 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -40,6 +40,8 @@
 
 ### Fixed
 
+- #4277 Adaptation de `spip_mysql_repair()` à innodb
+- #4277 Permettre de spécifier l'engine mysql à utiliser
 - #5095 Ne pas casser une meta sérialisée quand un utilisateur saisit un emoji dans un formulaire de configuration
 - #5152 Éviter des warning si `spip_log()` est appelé avant l’initialisation (dans mes_options)
 - #5162 Erreur d’exécution sur `vider_date()` qui doit renvoyer une chaine
diff --git a/ecrire/base/repair.php b/ecrire/base/repair.php
index 5962c4b35140a9740654b8c895ddd8d2da7476c0..bd416bb41a549001274d85baac4bfe65a2b7f45e 100644
--- a/ecrire/base/repair.php
+++ b/ecrire/base/repair.php
@@ -63,7 +63,7 @@ function base_repair_dist($titre = '', $reprise = '') {
  **/
 function admin_repair_tables() {
 
-	$repair = sql_repair('repair', null, 'continue');
+	$repair = sql_serveur('repair', '', true);
 
 	// recreer les tables manquantes eventuelles
 	include_spip('base/create');
diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php
index 335c4dc789f7bbb27ba456d324a74b78124a3aa3..07f2b34fa7830245c232ebec38251dfa28788d1f 100644
--- a/ecrire/req/mysql.php
+++ b/ecrire/req/mysql.php
@@ -27,6 +27,10 @@ if (!defined('_MYSQL_NOPLANES')) {
 	define('_MYSQL_NOPLANES', true);
 }
 
+if (!defined('_MYSQL_ENGINE')) {
+	define('_MYSQL_ENGINE', 'MyISAM');
+}
+
 /**
  * Crée la première connexion à un serveur MySQL via MySQLi
  *
@@ -728,7 +732,7 @@ function spip_mysql_create(
 	}
 	$temporary = $temporary ? 'TEMPORARY' : '';
 	$q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
-		. ' ENGINE=MyISAM'
+		. ' ENGINE=' . _MYSQL_ENGINE
 		. ($character_set ? " DEFAULT $character_set" : '')
 		. "\n";
 
@@ -881,7 +885,17 @@ function spip_mysql_showbase($match, $serveur = '', $requeter = true) {
  *     - true si la requête a réussie, false sinon
  */
 function spip_mysql_repair($table, $serveur = '', $requeter = true) {
-	return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
+	$table_status = spip_mysql_fetch(spip_mysql_query('SHOW TABLE STATUS WHERE Name = ' . _q($table), $serveur, true));
+	$engine = $table_status['Engine'];
+	if ($engine == 'InnoDB') {
+		if (spip_mysql_alter("TABLE $table ENGINE = InnoDB", $serveur, $requeter)) {
+			return [' OK '];
+		}
+	} elseif ($engine == 'MyISAM') {
+		return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
+	} else {
+		spip_log("spip_mysql_repair impossible pour la table $table engine $engine", 'mysql.' . _LOG_DEBUG);
+	}
 }
 
 /**