ORA-00911 « invalid character » : causes et solutions

ORA-00911 « invalid character » : point-virgule envoyé par l'application, caractère spécial, apostrophe non échappée… les causes et comment corriger.

Illustration de l'erreur Oracle ORA-00911

ORA-00911 « invalid character » signifie que votre requête contient un caractère qu’Oracle n’attend pas à cet endroit. Les coupables habituels : un point-virgule envoyé par une application, un caractère spécial dans un nom d’objet, ou un caractère « invisible » collé depuis un document. Voici comment le traquer.

Publicité

🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.

Le message

ORA-00911: invalid character
ORA-00911: caractère non valide

Cause 1 — Point-virgule envoyé depuis une application (n°1)

Les pilotes JDBC/ODBC/OCI exécutent un seul ordre et n’attendent pas de ; final :

// ❌ provoque ORA-00911
ResultSet rs = stmt.executeQuery("SELECT * FROM clients;");
// ✅
ResultSet rs = stmt.executeQuery("SELECT * FROM clients");

De même pour un / en fin de chaîne. (En SQL*Plus / SQL Developer, le ; est normal — d’où la confusion entre l’outil et l’appli.)

Cause 2 — Caractère spécial dans un nom d’objet non quoté

-- ❌ tiret, espace, accent dans un identifiant
SELECT * FROM ma-table;
CREATE TABLE info client (...);
-- ✅ si le nom contient vraiment ces caractères, le quoter
SELECT * FROM "ma-table";

Conseil : évitez les caractères spéciaux dans les noms d’objets ; n’utilisez que lettres, chiffres, _, $, #.

Cause 3 — Caractères « invisibles » collés depuis un document

Copier du SQL depuis Word, un PDF ou un chat introduit parfois :

  • des guillemets typographiques (« ” ’ ») au lieu de ' et " ;
  • des espaces insécables (U+00A0) au lieu d’espaces normaux ;
  • un BOM en début de fichier.

Solution : retapez la requête à la main dans SQL Developer, ou remplacez les caractères suspects.

Cause 4 — Apostrophe non échappée dans une chaîne

-- ❌ l'apostrophe de "L'Oréal" ferme la chaîne trop tôt
INSERT INTO marques (nom) VALUES ('L'Oréal');
-- ✅ doubler l'apostrophe
INSERT INTO marques (nom) VALUES ('L''Oréal');
-- ✅ ou notation Q
INSERT INTO marques (nom) VALUES (q'[L'Oréal]');

Cause 5 — Paramètre mal lié (bind variable)

Un :param resté littéral, ou un mélange de styles de paramètres entre l’appli et le SQL, peut injecter un caractère inattendu. Utilisez de vraies bind variables plutôt que de la concaténation.

Méthode de diagnostic express

  1. Enlevez tout ; ou / final si la requête vient d’une application.
  2. Recollez la requête dans un éditeur SQL : il pointe la position fautive.
  3. Cherchez guillemets typographiques, espaces insécables, accents dans les identifiants.
  4. Vérifiez les apostrophes dans les chaînes (doublez-les).

FAQ

Pourquoi ça marche dans SQL Developer mais pas dans mon code ?

SQL Developer accepte (et attend) le ; final ; le pilote JDBC/ODBC le refuse pour une requête unique. C’est la cause la plus fréquente d’ORA-00911 côté application.

Comment repérer un espace insécable invisible ?

Activez l’affichage des caractères invisibles dans votre éditeur, ou remplacez tous les espaces de la requête. En SQL : REPLACE(col, CHR(160), ' ') pour nettoyer des données.

Puis-je exécuter plusieurs ordres séparés par ; via JDBC ?

Non, pas en une seule exécution standard. Envoyez-les séparément, ou utilisez un bloc PL/SQL BEGIN … END;.

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité