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
Hébergements Web - MySQL 8.0: De nouveaux mots réservés
Related questions
- Connexion à mon compte client
146804
13.02.2019 09:51
- Serveur non sécurisé, celui-ci ne supporte pas FTP sur TLS
122353
03.09.2018 14:46
- reCAPTCHA erreur pour le propriétaire du site : clé de site non valide
107169
14.02.2019 16:17
- [FAQ] Comment mettre à jour mon site pour supporter Apache 2.4 ?
94380
28.07.2017 11:39
- Passage en php 7.4
93462
30.06.2020 05:05
- Augmenter taille PHP Post Max Size sur mutualisé ?
87915
04.12.2019 21:52
- The requested URL / was not found on this server
87095
02.03.2017 18:25
- NextCloud sur mutualisé
86848
07.04.2017 08:42
- Deploy d'un projet Node JS
86779
12.10.2016 20:18
- Ce site est inaccessible Impossible de trouver l'adresse DNS du serveur
86334
16.10.2016 16:24
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!