MIRAJv1.0
FR

15. Codes d'erreur

Chaque erreur que MIRAJ renvoie porte trois informations : un code numérique, un SQLSTATE à 5 caractères et un message dans la langue de la session. Cette page liste les codes numériques que le moteur peut produire, avec leur SQLSTATE et le libellé français exact du catalogue de messages, ainsi qu'une explication de la cause typique et, quand c'est utile, une piste de correction.

Précision de méthode : chaque ligne de ce chapitre a été vérifiée directement dans le code du moteur (catalogue de messages et table des codes). Quand le comportement exact d'un code n'a pas pu être confirmé avec certitude, cela est signalé explicitement plutôt que de risquer un libellé inventé.

1. Comment lire une erreur MIRAJ#

Une erreur renvoyée par le moteur ou par le serveur réseau se présente sous la forme :

ERROR 1146 (42S02): La table 'ventes.clients' n'existe pas
  • 1146 est le code numérique, propre à MIRAJ (repris d'une numérotation historique bien établie dans l'écosystème SQL, pour rester familier aux outils existants) ;
  • 42S02 est le SQLSTATE, une norme indépendante du moteur (voir §3) ;
  • le texte est le message, produit à partir d'un gabarit du catalogue (resources/french.json par défaut) dans lequel les %s ont été remplacés par les valeurs de l'erreur (nom de table, de colonne, etc.).

2. Table de référence des codes d'erreur#

Les codes ci-dessous sont ceux que le catalogue de messages du moteur définit effectivement (fichier crates/miraj-core/resources/french.json, table des codes crates/miraj-core/src/error.rs). Le message français est celui du catalogue, mot pour mot (%s = valeur substituée à l'exécution : nom de table, de colonne, etc.).

2.1 Erreurs de syntaxe et d'analyse#

CodeSQLSTATEMessageCause typiquePiste de correction
106442000Erreur de syntaxe SQL ; vérifiez le manuel de votre version de Miraj pour la syntaxe correcte près de '%s' à la ligne %sConstruction SQL invalide, mot-clé mal placé, syntaxe non prise en charge, ou profondeur d'imbrication de requête dépassée (au-delà de 1 000 niveaux)Relire l'instruction autour du texte cité par « near » ; vérifier les parenthèses et virgules
106542000La requête est videInstruction vide envoyée au serveurVérifier que le client n'envoie pas une chaîne vide
113942000Erreur « %s » dans l'expression régulièreMotif invalide passé à REGEXP, REGEXP_REPLACE, etc.Corriger le motif ; le détail de l'erreur du moteur d'expressions régulières est repris dans %s
1210HY000Arguments incorrects pour %sArgument(s) d'une fonction ou instruction incompatibles avec sa signatureVérifier le nombre et le type des arguments
1221HY000Utilisation incorrecte de %s et %sCombinaison de deux constructions incompatibles dans la même instructionSéparer les deux constructions ou consulter la documentation de l'instruction concernée
123542000Cette version de Miraj ne prend pas encore en charge '%s'Construction syntaxiquement valide mais non implémentée dans cette version (voir le chapitre Limites connues)Consulter docs/manuel/16-limites-connues.md pour une alternative
140742000SQLSTATE incorrect : '%s'SIGNAL/RESIGNAL SQLSTATE '...' avec une valeur qui n'est pas un code à 5 caractères valideUtiliser un SQLSTATE conforme (5 caractères, classe différente de 00, 01, XA)

2.2 Erreurs de schéma (bases, tables, colonnes, index)#

CodeSQLSTATEMessageCause typiquePiste de correction
29HY000Fichier '%s' introuvable (code : %s)Fichier attendu par le moteur absent du disque (table, journal...)Vérifier le chemin et les droits d'accès au dossier de données
1004HY000Impossible de créer le fichier '%s' (errno : %s)Écriture disque impossible (droits, disque plein, chemin invalide)Vérifier l'espace disque et les droits sur le dossier de données
1005HY000Impossible de créer la table '%s' (errno : %s)Échec d'écriture du fichier .mrj à la créationVérifier l'espace disque et les droits
1007HY000Impossible de créer la base '%s' ; elle existe déjàCREATE DATABASE sans IF NOT EXISTS sur une base existanteAjouter IF NOT EXISTS ou choisir un autre nom
1008HY000Impossible de supprimer la base '%s' ; elle n'existe pasDROP DATABASE sans IF EXISTS sur une base absenteAjouter IF EXISTS ou vérifier le nom
1034HY000Fichier de la table '%s' incorrect ; essayez de la réparer (%s)Fichier .mrj corrompu ou tronquéExécuter REPAIR TABLE (voir la section correspondante du manuel)
104442000Accès refusé pour l'utilisateur '%s'@'%s' à la base de données '%s'Compte sans privilège sur la base (contrôlé à chaque USE et à la poignée de main)Accorder un privilège de base avec GRANT
104528000Accès refusé pour l'utilisateur '%s'@'%s' (mot de passe utilisé : %s)Identifiants invalides à la connexionVérifier le compte et le mot de passe
10463D000Aucune base de données sélectionnéeInstruction nécessitant une base courante exécutée sans USEExécuter USE <base> avant l'instruction, ou qualifier les objets
104942000Base de données '%s' inconnueUSE ou référence à une base qui n'existe pasVérifier l'orthographe ou créer la base
105042S01La table '%s' existe déjàCREATE TABLE sans IF NOT EXISTS sur un nom déjà pris (table ou vue)Ajouter IF NOT EXISTS, ou DROP / CREATE OR REPLACE
105142S02Table '%s' inconnueRéférence à une table absente (contexte sans nom de base explicite)Vérifier le nom et la base courante
105223000La colonne '%s' dans %s est ambiguëColonne présente dans plusieurs tables de la requête sans qualificationQualifier la colonne (table.colonne)
105442S22Colonne '%s' inconnue dans '%s'Nom de colonne mal orthographié ou colonne inexistante dans le contexte citéVérifier DESCRIBE <table> ou information_schema.COLUMNS
106042S21Nom de colonne '%s' en doubleDeux colonnes du même nom dans une même définition de table ou un CREATE TABLE … SELECTRenommer l'une des colonnes ou lui donner un alias
106142000Nom de clé '%s' en doubleDeux index/clés du même nom sur la tableChoisir un autre nom d'index
106642000Table ou alias non unique : '%s'Même nom de table ou d'alias utilisé deux fois dans une requêteDonner un alias distinct à chaque occurrence
110242000Nom de base de données incorrect : '%s'Nom hors des règles (longueur, caractères autorisés — voir Limites connues)Utiliser des caractères ASCII, chiffres, _, $ et espace (jamais en dernière position), 64 octets au plus
110342000Nom de table incorrect : '%s'Même règle que 1102, appliquée au nom de tableIdem
110942S02Table '%s' inconnue dans %sTable référencée absente dans le contexte précisé (%s : clause, jointure...)Vérifier le nom de la table dans cette clause
114642S02La table '%s.%s' n'existe pasTable absente de la base indiquéeVérifier le nom et la base, ou la créer
116642000Nom de colonne incorrect : '%s'Nom de colonne hors des règles d'identifiantRenommer selon les règles (voir Limites connues)
117042000La colonne BLOB/TEXT '%s' est utilisée dans une clé sans longueur de cléBLOB/TEXT utilisée comme colonne de clé primaire, UNIQUE ou indexUtiliser une colonne de longueur bornée, ou une colonne générée à partir d'un extrait
128042000Nom d'index incorrect : '%s'Nom d'index invalide ou trop longRaccourcir ou corriger le nom
3162HY000Le compte %s n'existe pas.Rôle/compte cité qui n'existe pasVérifier CREATE USER / le nom exact du compte
3163HY000Le compte %s existe déjà.CREATE USER sur un compte déjà définiUtiliser IF NOT EXISTS ou choisir un autre nom

2.3 Erreurs de contraintes et de données#

CodeSQLSTATEMessageCause typiquePiste de correction
104823000La colonne '%s' ne peut pas être NULLINSERT/UPDATE fournissant NULL à une colonne NOT NULL sans valeur implicite disponibleFournir une valeur, ou revoir la contrainte NOT NULL
106223000Doublon '%s' pour la clé '%s'Violation d'une clé primaire ou UNIQUEUtiliser INSERT IGNORE, REPLACE ou ON DUPLICATE KEY UPDATE si le doublon est attendu
106842000Plusieurs clés primaires définiesDeux clauses PRIMARY KEY dans une même définition de tableN'en garder qu'une
113621S01Le nombre de colonnes ne correspond pas au nombre de valeurs à la ligne %sINSERT ... VALUES (...) avec un nombre de valeurs différent du nombre de colonnesFaire correspondre les deux listes
113822004Utilisation incorrecte de la valeur NULLNULL utilisé là où il n'est pas permis (ex. valeur d'une contrainte)Retirer le NULL ou revoir l'expression
117142000Toutes les parties d'une clé primaire doivent être NOT NULL ; utilisez UNIQUE pour accepter NULLColonne nullable incluse dans une PRIMARY KEYRendre la colonne NOT NULL ou utiliser une contrainte UNIQUE
117242000Le résultat compte plus d'une ligneSous-requête scalaire ou SELECT ... INTO recevant plusieurs lignesAjouter une condition qui ramène le résultat à une ligne, ou utiliser LIMIT 1 en connaissance de cause
1215HY000Impossible d'ajouter la contrainte de clé étrangèreDéfinition de clé étrangère invalide (types incompatibles, index manquant côté parent...)Vérifier les types des colonnes et l'existence d'un index sur la colonne référencée
124221000La sous-requête renvoie plus d'une ligneSous-requête utilisée en contexte scalaire (=, SELECT ... INTO) qui rend plusieurs lignesRestreindre la sous-requête ou utiliser IN / EXISTS
126422003Valeur hors limites pour la colonne '%s' à la ligne %sValeur numérique hors de la plage du type déclaré (voir Limites connues, tableau des types)Utiliser un type plus large ou corriger la valeur
129222007Valeur %s incorrecte tronquée : '%s'Conversion échouée avec troncature (ex. chaîne non numérique convertie en nombre)Corriger la valeur source ou son format
136522012Division par zéroDivision ou modulo par 0Protéger l'expression (CASE WHEN ... != 0) ou accepter le résultat NULL selon le mode SQL
136622007Valeur %s incorrecte : '%s' pour la colonne %s à la ligne %sValeur incompatible avec le type de la colonne à l'écritureCorriger la valeur ou le type de colonne
140622001Données trop longues pour la colonne '%s' à la ligne %sChaîne plus longue que la longueur déclarée de la colonneAgrandir la colonne ou tronquer la valeur en amont
145123000Impossible de supprimer ou de modifier une ligne parente : une contrainte de clé étrangère échoue (%s)Suppression/modification d'une ligne encore référencée par une table enfantSupprimer/modifier d'abord les lignes enfants, ou revoir l'action ON DELETE/ON UPDATE
145223000Impossible d'ajouter ou de modifier une ligne enfant : une contrainte de clé étrangère échoue (%s)Insertion/modification référençant une ligne parente inexistanteInsérer d'abord la ligne parente, ou vérifier la valeur de la clé étrangère
402523000La CONTRAINTE %s a échoué pour %s.%sLigne refusée par une contrainte CHECKCorriger la valeur pour satisfaire la contrainte, ou revoir la contrainte

2.4 Erreurs de privilèges#

CodeSQLSTATEMessageCause typiquePiste de correction
104442000Accès refusé pour l'utilisateur '%s'@'%s' à la base de données '%s'Contrôle de niveau base (voir §2.2)Accorder le privilège de base nécessaire
114242000Commande %s refusée à l'utilisateur '%s'@'%s' pour la table '%s'Contrôle de niveau table, avant même la résolution du nomAccorder le privilège de table nécessaire (SELECT, INSERT...)
114442000Commande GRANT/REVOKE invalide ; consultez le manuel pour savoir quels privilèges s'appliquent à ce niveauGRANT/REVOKE d'un privilège à un niveau où il n'a pas de sens (ex. privilège de table au niveau global)Utiliser le niveau adapté au privilège
122742000Accès refusé ; il faut le privilège %s pour cette opérationContrôle de niveau global (SUPER, RELOAD, SHUTDOWN...)Accorder le privilège global nommé dans le message
3523HY000Compte ou rôle inconnu %s@%sSET ROLE ou GRANT/REVOKE sur un rôle qui n'existe pasCréer le rôle avec CREATE ROLE ou corriger le nom
3530HY000%s@%s n'est pas accordé à %s@%sSET ROLE sur un rôle non accordé au compte courantAccorder le rôle avec GRANT <rôle> TO <compte>
3619HY000Niveau de privilège invalide pour %sPrivilège dynamique demandé hors du niveau globalAccorder au niveau global (ON *.*)

Les privilèges par colonne (GRANT SELECT (colonne) ON ...) et par routine ne sont pas implémentés dans cette version (voir le chapitre Limites connues) : aucune erreur de ce type précis n'est donc émise pour ce cas.

2.5 Erreurs de transaction et de concurrence#

CodeSQLSTATEMessageCause typiquePiste de correction
1205HY000Délai d'attente du verrou dépassé ; réessayez la transactionLOCK TABLES, SELECT ... FOR UPDATE NOWAIT/WAIT n, ou attente d'un verrou de table au-delà de lock_wait_timeoutRéessayer la transaction ; envisager de réduire la durée des transactions concurrentes
121340001Interblocage détecté lors de la prise du verrou ; réessayez la transactionConcurrence entre transactions sur les mêmes lignes (MIRAJ n'attend jamais : ce code couvre aussi bien un vrai interblocage qu'un simple conflit de version MV-OCC après 3 tentatives internes). Rendu aussi par un COMMIT dont une mise à jour différée ne peut plus s'appliquer (ligne supprimée, condition du WHERE devenue fausse, ligne tenue par une autre transaction, ligne lue puis modifiée par une autre transaction)Réessayer la transaction côté client ; MIRAJ n'ayant pas d'attente bloquante, ce code apparaît plus souvent que sur un moteur à verrous classiques. Un COMMIT peut aussi rendre le code d'une erreur de calcul découverte en recalculant une mise à jour différée (1264, 1048, 4025…) : la transaction est alors annulée en entier (chapitre 9, §9.2)
179225006Impossible d'exécuter l'instruction dans une transaction en lecture seule (READ ONLY).Écriture tentée dans une transaction ouverte en READ ONLY, ou sur un secondaire de cluster (voir §2.6)Ouvrir une transaction en lecture-écriture, ou écrire sur le nœud primaire
192770100La connexion a été arrêtéeConnexion terminée par KILL ou par le serveurSe reconnecter
196970100Requête interrompue : limite de durée de %s s dépasséemax_statement_time ou l'indication MAX_EXECUTION_TIME dépassésOptimiser la requête ou augmenter la limite si elle est légitime
1095HY000Vous n'êtes pas propriétaire de la connexion %sKILL d'une connexion qui n'appartient pas au compte courant, sans le privilège nécessaireUtiliser un compte disposant du privilège adéquat, ou cibler sa propre connexion
1094HY000Identifiant de connexion inconnu : %sKILL avec un identifiant de connexion qui n'existe plusVérifier l'identifiant avec SHOW PROCESSLIST
1099HY000La table '%s' est verrouillée en lecture (READ) et ne peut pas être modifiéeÉcriture tentée sur une table verrouillée en lecture par LOCK TABLESVerrouiller en écriture (WRITE) ou attendre la fin du verrou
1100HY000La table '%s' n'a pas été verrouillée par LOCK TABLESTable utilisée dans une session sous LOCK TABLES sans avoir été elle-même verrouilléeAjouter la table à la liste de LOCK TABLES

2.6 Erreurs de cluster et de réplication (édition Cluster)#

CodeSQLSTATEMessageCause typiquePiste de correction
1290HY000Le serveur fonctionne avec l'option %s et ne peut pas exécuter cette instructionTentative d'écriture sur un nœud secondaire en lecture seule, ou option serveur incompatible avec l'instructionÉcrire sur le nœud primaire du cluster ; consulter SHOW CLUSTER STATUS
9002HY000%s demande l'édition MIRAJ ClusterFonctionnalité de partitionnement effectif (segments, EXCHANGE PARTITION sur HASH/KEY...) utilisée hors édition ClusterPasser à l'édition Cluster, ou se limiter aux fonctions de partitionnement disponibles en édition Standard (définition acceptée, stockage non partitionné)
9003HY000Promotion refusée : %sSET GLOBAL cluster_role = 'primary' refusé après sonde des autres nœuds : primaire encore joignable, autre promotion en cours, pair qui voit encore le primaire, pair plus avancé qui ne garde plus la partie manquante du journal, bases différentes, écritures confirmées aux clients (réplication semi-synchrone) tenues par aucun nœud joignable, retard supérieur à max_promotion_lag_mb, base en attente de réamorçage après une table réécrite hors journal par le primaire (waiting to be copied again), nœud FENCED ou en cours d'amorçage ; en mode raft (élection automatique), refus d'un votant (node n2 refused: not up to date on database shop (epoch 4 < 5), candidate lacks database …, already voted for …), absence de majorité joignable (cluster has no quorum: 1 of 3 members reachable) ou élection déjà en cours (le motif précis suit les deux-points, en anglais)Selon le motif : rétrograder d'abord l'ancien primaire ('secondary'), promouvoir un autre secondaire, ou forcer en acceptant la perte (SET GLOBAL cluster_role = 'force_primary') ; voir le chapitre 12, §12.4
9004HY000Réplication synchrone : %sRéplication semi-synchrone (@@cluster_sync_commit à RECEIVED, APPLIED ou MAJORITY) : accusés des secondaires non reçus dans @@cluster_sync_timeout ou trop peu de secondaires connectés (avertissement avec la conduite FALLBACK, erreur avec ERROR), attente annulée par KILL QUERY (avertissement), nœud rétrogradé ou écarté pendant l'attente (erreur ; quorum lost quand un leader élu rend son rôle faute de majorité, mode raft). L'écriture est toujours validée sur le primaire (motif en anglais après les deux-points)Ne pas rejouer l'écriture sans relire (risque de doublon) ; vérifier les secondaires (SHOW CLUSTER STATUS, colonne SYNC) ; voir le chapitre 12, §12.8
1194HY000La table '%s' est marquée comme endommagée et doit être réparée (%s)Cas particulier : lecture d'une table partitionnée en segments par l'édition Cluster depuis une édition qui ne sait pas la lireOuvrir la table depuis un serveur en édition Cluster

2.7 Erreurs propres à MIRAJ (éditions et vecteurs)#

Ces codes n'existent dans aucun autre moteur SQL ; ils sont propres à MIRAJ.

CodeSQLSTATEMessageCause typiquePiste de correction
9001HY000%s n'est pas disponible dans l'édition MIRAJ ExpressFonctionnalité réservée à l'édition Standard ou Cluster utilisée en édition Express (ex. parallélisme intra-requête)Passer à l'édition Standard ou Cluster si la fonctionnalité est nécessaire
9002HY000%s demande l'édition MIRAJ ClusterVoir §2.6Voir §2.6
9003HY000Promotion refusée : %sVoir §2.6Voir §2.6
9004HY000Réplication synchrone : %sVoir §2.6Voir §2.6
6133HY000La colonne non scalaire (vecteur par exemple) '%s' ne peut pas servir de clé.VECTOR(n) utilisée en clé primaire, UNIQUE ou indexNe pas indexer la colonne vectorielle ; indexer une colonne dérivée si besoin
6138HY000Données impossibles à convertir en vecteur valide : '%s'Valeur non convertible en VECTOR(n)Corriger le format de la valeur (forme texte […] ou binaire)
760022000dimensions de vecteurs différentes %s et %sOpération entre deux vecteurs de dimensions différentesUtiliser des vecteurs de même dimension
760122000%s dimensions attendues, et non %sVecteur écrit dans une colonne VECTOR(n) avec une dimension différente de nAjuster le nombre de composantes
760222P02syntaxe incorrecte pour le type vector : "%s"Forme texte d'un vecteur invalideUtiliser la forme [v1, v2, ...]
760322000NaN interdit dans un vecteurComposante NaN dans un vecteurRetirer les valeurs NaN en amont
760422000valeur infinie interdite dans un vecteurComposante infinie dans un vecteurRetirer les valeurs infinies en amont
4206HY000Impossible de déterminer le type de distance de VEC_DISTANCE : aucun index trouvéVEC_DISTANCE appelée sans index vectoriel exploitable (les index vectoriels ne sont pas encore implémentés — voir Limites connues)Utiliser ORDER BY <distance> LIMIT k, qui calcule un k-NN exact sans index

2.8 Erreurs internes et diverses#

CodeSQLSTATEMessageCause typiquePiste de correction
1024HY000Erreur de lecture du fichier '%s' (errno : %s)Erreur disque à la lecture d'un fichier du moteurVérifier le disque, restaurer depuis une sauvegarde si le fichier est endommagé
1026HY000Erreur d'écriture du fichier '%s' (errno : %s)Erreur disque à l'écriture (disque plein, droits...)Vérifier l'espace disque et les droits
1028HY000Tri interrompu : %sORDER BY interrompu (ex. par KILL ou une limite de lignes examinées)Voir le message pour la cause précise ; relancer si l'interruption n'était pas voulue
1105HY000Erreur inconnue : %sErreur interne inattendue (bogue du moteur, fichier de définitions de routines/déclencheurs corrompu...)Signaler l'erreur avec le contexte complet ; vérifier l'intégrité des fichiers de la base concernée
114842000Cette commande n'est pas autorisée avec cette version du serveurCommande refusée par le protocole réseau (ex. LOCAL INFILE refusé par un client qui ne l'accepte pas)Vérifier la configuration du client
1193HY000Variable système inconnue : '%s'SET/SELECT @@variable sur un nom de variable qui n'existe pasVérifier le nom exact dans SHOW VARIABLES
123142000La variable '%s' ne peut pas recevoir la valeur '%s'Valeur hors du domaine attendu pour une variable systèmeConsulter la documentation de la variable pour les valeurs admises
123542000Cette version de Miraj ne prend pas encore en charge '%s'Voir §2.1 : fonctionnalité non encore implémentéeVoir docs/manuel/16-limites-connues.md

3. Le SQLSTATE#

Le SQLSTATE est un code à exactement 5 caractères (chiffres et lettres majuscules), normalisé indépendamment de MIRAJ et partagé par la plupart des moteurs SQL. Une application peut s'y fier pour un traitement générique, sans connaître le libellé ni même le code numérique propre à MIRAJ — utile pour porter un code écrit contre un autre moteur SQL.

Quelques classes à connaître :

SQLSTATESignificationExemples de codes MIRAJ
42000 (et les 42Sxx)Erreur de syntaxe ou de règle d'accès (« syntax error or access rule violation »)1064, 1049, 1050, 1051, 1054
23000Violation de contrainte d'intégrité1048, 1062, 1451, 1452, 4025
3D000Base de données non sélectionnée1046
28000Autorisation invalide (authentification)1045
40001Transaction annulée en série (interblocage ou conflit de concurrence)1213
22000 et dérivés (22001, 22003, 22007, 22012...)Erreur de données (« data exception ») : troncature, dépassement, division par zéro1264, 1292, 1365, 1366, 1406
25006Instruction interdite en transaction en lecture seule1792
70100Instruction interrompue (SQLSTATE d'une convention répandue dans l'écosystème SQL, reprise par MIRAJ)1317, 1927, 1969
HY000Erreur générale, sans classe SQLSTATE plus précisela majorité des erreurs propres au moteur (1004, 1105, 1193, 9001, 9002, 9003, 9004...)

Usage recommandé côté application : un pilote (ODBC, JDBC, ADO.NET...) expose en général le SQLSTATE à côté du code natif. Pour un traitement portable entre moteurs (retenter une transaction en cas de 40001, distinguer une erreur de contrainte 23000 d'une erreur de syntaxe 42000), s'appuyer sur le SQLSTATE. Pour un diagnostic précis propre à MIRAJ (afficher un message adapté, distinguer deux causes qui partagent le même SQLSTATE), s'appuyer sur le code numérique de cette page.

Quand aucun SQLSTATE plus spécifique n'est défini pour un code, MIRAJ renvoie HY000 par défaut (y compris pour un code totalement inconnu du catalogue).

Un code déclenché par une routine stockée avec SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '...' porte le SQLSTATE choisi par la routine plutôt que celui associé au code numérique générique de SIGNAL — c'est le mécanisme normal pour lever une erreur applicative avec un SQLSTATE personnalisé (classe 45 réservée à cet usage).

4. Langue des messages#

Les messages d'erreur de MIRAJ existent en plusieurs langues : français, anglais, et huit langues supplémentaires (chinois, hindi, espagnol, arabe, portugais, russe, allemand, japonais). Cette page documente le libellé français, langue de référence de ce manuel.

Pour obtenir les messages en anglais (ou dans une autre langue disponible) :

  • au démarrage du serveur ou en ligne de commande, l'option de langue du moteur sélectionne le catalogue utilisé pour toute la session ;
  • chaque erreur peut aussi être reformulée dans une langue donnée sans changer la langue de la session, si l'API ou l'outil utilisé expose cette fonctionnalité (retraduction à la demande depuis le code et les arguments de l'erreur) ;
  • des fichiers <langue>.json déposés à côté de l'exécutable du serveur permettent de compléter ou de remplacer les traductions embarquées, y compris pour ajouter une langue non listée ci-dessus.

Le code numérique et le SQLSTATE d'une erreur ne changent jamais avec la langue : seul le texte du message est traduit. Une application qui teste le code ou le SQLSTATE (plutôt que le texte du message) fonctionne donc à l'identique quelle que soit la langue configurée sur le serveur.