Hébergements Web - MySQL 8.0: De nouveaux mots réservés
BMPCreated with Sketch.BMPZIPCreated with Sketch.ZIPXLSCreated with Sketch.XLSTXTCreated with Sketch.TXTPPTCreated with Sketch.PPTPNGCreated with Sketch.PNGPDFCreated with Sketch.PDFJPGCreated with Sketch.JPGGIFCreated with Sketch.GIFDOCCreated with Sketch.DOC Error Created with Sketch.
Frage

MySQL 8.0: De nouveaux mots réservés

Von
MikaelD1
Neuling
Erstellungsdatum 2024-04-30 19:45:03 (edited on 2024-11-18 11:02:15) in Hébergements Web

English post here.

TL;DR: MySQL 8.0 a introduit de nouveaux mots réservés, ce qui peut aboutir à de rares erreurs côté client.

---

MySQL 8.0 arrive bientôt sur les bases de données livrées avec vos hébergement web, appelées également «SharedSQL» ou «Bases de données MySQL mutualisées» (plus d'infos prochainement). En attendant, vous pouvez vous préparer.

**Mots réservés**

select `col1` from `mytable`;

Quand un SGBD comme MySQL reçoit cette requête SQL très simple, il la parse pour savoir quoi faire.

L'une des premières étapes de ce parsing est de distinguer les mots réservés (un mot ayant du sens en SQL) des identifiants (le nom que vous donnez à un objet, comme une table ou une colonne).

1. Si un mot est entre backquotes "`", alors c'est un identifiant.
2. Sinon, si il est dans la liste des mots réservés ("select", "from", "database", "table"…), alors c'est un mot réservé.
3. Sinon, c'est un identifiant.

Dans la requête ci-dessus, "col1" et "mytable" ne sont pas des mots réservés. Ce n'est donc pas obligatoire de les mettre entre "`", et la requête peut s'écrire comme ça:

select col1 from mytable;

Mais, si le nom de votre table est "select":

1. C'est bizarre 😅
2. Vous DEVEZ utiliser "`" si vous voulez utiliser ce nom comme identifiant

select * from `select`;
=> OK

select * from select;
=> C'est une erreur de syntaxe

**Bonne pratique: ORM**

Les développeurs front ne DOIVENT pas être experts en SQL et en SGBD. Ils ont des choses bien plus intéressantes à faire. Si vous voulez vous débarasser des spécificités du SQL et des SGBD, bouger d'une version de DBMS (comme MySQL 5.7) à une autre (comme MySQL 8.0), ou bouger d'un DBMS (comme MySQL) à un autre (comme PostgreSQL), alors utilisez un ORM. Vous n'aurez alors qu'à manipuler des objets, et c'est la mission de l'ORM de mettre des "`" là où il faut.

**Bonne pratique: les backquotes**

Si vous ne voulez pas utiliser un ORM (c'est dommage), utilisez au moins des backquotes.

"Si ton identifiant est un mot réservé, utilise des backquotes". OK, on va la faire plus simple. Utilisez simplement des backquotes pour tous vos identifiants.

**Les nouveaux mots réservés introduits en MySQL 8.0**

MySQL 8.0 a introduit 23 nouveaux mots réservés (ce n'était pas des mots réservés en MySQL 5.7):

* CUME_DIST
* DENSE_RANK
* EMPTY
* EXCEPT
* FIRST_VALUE
* GROUPING
* GROUPS
* INTERSECT
* JSON_TABLE
* LAG
* LAST_VALUE
* LATERAL
* LEAD
* NTH_VALUE
* NTILE
* OF
* OVER
* PERCENT_RANK
* RANK
* RECURSIVE
* ROW_NUMBER
* SYSTEM
* WINDOW

Ça veut dire qu'après la mise à jour de MySQL 5.7 vers 8.0, vous pouvez vous retrouver dans un rare cas d'erreur si:

* L'un des 23 mots ci-dessus est utilisé comme identifiant (comme le nom d'une table ou d'une colonne)
* Et que vous ne suivez aucune des 2 bonnes pratiques ci-dessus

Dans ce cas, une requête qui passait en MySQL 5.7:

select * from groups;
=> OK

Devient une erreur de syntaxe en MySQL 8.0:

select * from groups;
=> ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'groups' at line 1

**Solution**

Utilisez l'une des 2 bonnes pratiques ci-dessus.

Plus d'informations (avec entre autres: qu'est-ce qu'un "mot clé" ?): https://dev.mysql.com/doc/refman/8.0/en/keywords.html

Mikaël


3 Antworten ( Latest reply on 2024-11-18 11:02:30 Von
FatmaK1
)

Merci @MikaelD1 pour cette version française*

J'ajouterais que la fonction PASSWORD() n'existe plus dans MySQL 8.0, à moins que OVH prévoie une custom fonction pour la remplacer.
(je suis peut-être le seul à l'utiliser cela dit...)

Bonjour,
j'ai un projet cakephp3.4 et j'utilise dedans le model Groups
cela bloque ma requête :

$user= $this->Users->find('all',['contain'=>['Groups']])->where(['Users.id'=>$this->request->session()->read('Auth.User.id')])->first();
Si vous pouvez m'aider à résoudre mon probleme.
Je vous remercie d'avance!