Je propose quelque chose pour la communauté :
La liste des pays francais/anglais avec les codes avec insertion dans MYSQL.
Télécharger le fichier, plus d'infos sur le site
Je propose quelque chose pour la communauté :
La liste des pays francais/anglais avec les codes avec insertion dans MYSQL.
Télécharger le fichier, plus d'infos sur le site
Voici une fonction qui permet de mettre le premier caractère en majuscule. Mysql5
N'étant pas satisfait du uuid() mysql pour une raison particulière je m'en suis fait une.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 CREATE FUNCTION `ucfirst`(p_str VARCHAR(255)) RETURNS varchar(255) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN DECLARE strOut VARCHAR(255); SET strOut = TRIM(p_str); SET strOut = CONCAT(UPPER(LEFT(strOut,1)), RIGHT(strOut,CHARACTER_LENGTH(strOut)-1)); RETURN strOut; END;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 CREATE FUNCTION `UUIDII`() RETURNS char(36) DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN DECLARE hashe1 VARCHAR(8); DECLARE hashe2 CHAR(4); DECLARE hashe3 CHAR(4); DECLARE hashe4 CHAR(4); DECLARE hashe5 CHAR(12); DECLARE hasheRef CHAR(36); SET hashe1 = SUBSTRING(MD5(RAND()),25); SET hashe2 = SUBSTRING(MD5(RAND()),29); SET hashe3 = SUBSTRING(MD5(RAND()),29); SET hashe4 = SUBSTRING(MD5(RAND()),29); SET hashe5 = SUBSTRING(MD5(RAND()),21); SET hasheRef = CONCAT_WS('-', hashe1, hashe2, hashe3, hashe4, hashe5); RETURN hasheRef; END;
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
Il existe une norme (déclinée) pour cela : ISO 3611. Je pense qu'un lien vers cette norme est préférable, car constamment à jour.
En fait, je me suis intéressé à ça pour pa passer les identifiant d'enregistrement en paramètre. productid=12. 12 qui correspond un l'id d'un enregistrement dans une table. Pour un produit pas de probleme si c'est à 12 mais un concurrent voi 12785. Surtout qu'il peut savoir que les données sont autoincrémenté. En terme de sécurité c'est un peut risqué de mettre des données sensible.
le UUID peut fausser l'information et ne montre aucune hiérarchie ni un sens logic à un paramètre. Apparement il se base sur des identifiant reseau. Ce qui affiche un peut pret toujours les mêmes données (12 premiers caractères) mais sans qu'elle puisse être identique. Je voulais rendre l'information plus flou. J'ai donc fait un UUID() à ma sauce.
J'ai une table qui possède tous les id utilisés afin qu'il ne puisse en créer un indentique. Toute les tables qui doivent communiquer avec l'extérieur doivent passer par cette table "Table InOut".
Pour des raisons de développment et de maintenance chaque enregistrement de cette table (InOut) possède le nom de la table et id qui l'utilise. Ainsi je peux savoir qui utilise cette uuid.
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
Petite proposition : comment désactiver la commande (destructrice) DROP DATABASE avec PhpMyAdmin :
http://www.developpez.net/forums/sho...d.php?t=403838
Voici une fonction permettant de faire une split d'une chaine. Celui-ci retourne un tableau. En fait, ce n'est pas une fonction mais une procédure stocké. La raison est qu'une fonction n'accepte pas des chaines de caractère avec des accents.
La procédure stocké va envoyé le resultat dans une table temporaire nommé t_split.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 CREATE PROCEDURE `Split`(IN p_str TEXT, IN p_delimiter CHAR(1)) DETERMINISTIC CONTAINS SQL SQL SECURITY INVOKER COMMENT '' BEGIN DECLARE Pos INTEGER(11); DECLARE sub_Str TEXT; SET Pos = 1; SET sub_Str = ''; BEGIN CREATE TEMPORARY TABLE IF NOT EXISTS t_split( `idItem` INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT, `Item` TEXT, PRIMARY KEY (`idItem`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT = 'Tempory table'; END; TRUNCATE t_split; COMMIT; WHILE Pos <= LENGTH(p_str) DO BEGIN IF SUBSTRING(p_str, Pos, 1) <> p_delimiter THEN SET sub_Str = CONCAT(sub_Str, SUBSTRING(p_str, Pos, 1)); ELSE INSERT INTO t_split (Item) VALUES(sub_Str); SET sub_Str = ''; END IF; IF LENGTH(p_str) = Pos THEN INSERT INTO t_split (Item) VALUES(sub_Str); END IF; SET Pos = (Pos + 1); END; END WHILE; SELECT * FROM t_split; END; CALL Split('titi|tata|tutu','|'); SELECT * FROM t_split;
Si vous executez la procédure il vous retourne une table avec deux champs IdItem et Item.
De là, vous pouvez encore récupérer le resultat en faisant select * from t_split pour travailler dessus.
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
Bonjour,
je ne sais pas trop si cette question est déjà posée dans la FAQ, en tout cas j'ai rencontré le problème ce matin à savoir calculer l'âge d'un individu en fonction de sa date de naissance au format date %d/%m/%Y et je propose cette solution :
En espérant que ce bout de code puisse aider du monde
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT YEAR(NOW()) - YEAR(DATE_NAISSANCE) + IF(DATEDIFF( STR_TO_DATE(CONCAT('0001', DATE_FORMAT(NOW(), '%d%m')), '%Y%d%m'), STR_TO_DATE(CONCAT('0001', DATE_FORMAT(DATE_NAISSANCE, '%d%m')), '%Y%d%m') ) < 0, -1, 0) FROM DUAL
"Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."
J'ai une suggestion pour la faq
Connaitre la prochaine valeur d'un champ auto-incrémenté
L'information se trouve dans le STATUS de la table.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $req = "SHOW TABLE STATUS LIKE 'MATABLE'"; $res = mysql_query($req); $q = mysql_fetch_object($res); echo "La prochaine valeur sera : ".$q->Auto_increment;
Je déconseille fortement cette pratique. En effet, si elle fonctionne quand un seul utilisateur est connecté à la base de données, elle sera source d'erreur dans le cas de requêtes concurrentes. Je conseille plutôt de sélectionner la prochaine valeur avec NEXTVAL() et ensuite de s'en servir (ou pas). Si on ne se sert pas de la prochaine valeur, on perd juste un numéro dans l'incrémentation, et personne n'en mourra. On place rarement un champ autoincrémenté sur un entier très court.
Bonjour,
En effet il est déconseillé d'appliquer l'identification d'un tuple coté applicatif (ici PHP).
Si deux personnes accèdent à cette page quasi-simultanément, alors ils auront strictement la même valeur d'auto-increment. Si ensuite ils affectent cette valeur comme identifiant lors d'un insert, le premier à executer la requête n'y verra rien, mais le second sera sanctionné sans doute d'une violation de l'intégritée référentielle.
Avec NEXTVAL, lors de son appel, on récupère la valeur suivante, mais l'auto-increment est également incrémenté. Ainsi, même avec deux requêtes quasi-simultanées, les deux client auront deux clé différentes, et il n'y a plus de risques au niveau de l'intégritée.
A ma connaissances NEXTVAL existe que sur des sequences, qui sont des objets dédiés à l'identification de tuples. Je t'invite donc à te renseigner a leurs sujets
http://alaindefrance.wordpress.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
SDE at BitTitan
http://mysql.developpez.com/faq/?pag..._INCREMENT_max
Par contre, c'est bien la première fois que j'entends parler de séquences et de NEXTVAL dans MySQL... Alex, tu confirmes ?
Je me suis peut-être mal exprimé. Quand je parle de sequence et NEXTVAL je ne faisait qu'expliquer le fonctionnement d'une séquence, faisant référence au message d'Alex.
Pour ma part je n'ai également jamais croisé de sequences avec MySQL, mais rien ne nous empeche de les reproduire si besoin il y a.
http://alaindefrance.wordpress.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
SDE at BitTitan
Je pense que celui qui s'est le plus mal exprimé c'est moi surtout. Je travailles désormais essentiellement sous Postgres et nous migrons nos applications sous MySql pour certains clients qui ont déjà un serveur MySQL et qui ne veulent pas d'un second serveur de base de données.
Nous estimons (c'est un constat personnel lié à nos applications) que l'autoincrémentation n'est pas une solution intéressante. Alors nous avons reproduit le fonctionnement des séquences. La méthode est simple, si simple que j'en oublie que ce n'est pas un module de MySQL. On crée une table avec un champ identifiant la table et la valeur de la clef. Un des développeurs de notre équipe a créé les fonctions qui vont avec les séquences (currval, nextval, setval). Le premier paramètre de cette valeur est l'identifiant de la table. Malheuresement les copyright actuels sur ce code ne me permettent pas de le communiquer. Comme nous sommes dans une politique d'ouverture de code au sein du MEEDDATT, je vais essayer de voir.
Alors je précise avant tout qu'ici, je n'exprime qu'une opinion personnelle. Ce n'est en rien une vérité. L'auto incrémentation est très interessante dans 98% des cas. Une clef primaire auto-incrémentée sans séquence est pratique sauf dans deux cas à mon sens
Le premier cas concerne les procédures qui nécessitent plusieurs évènements. Nous trouvons préférable de faire appel à tous les identifiants avant les insertions, puis de tout insérer d'un bloc.
Nous avons remarqué que de grouper les trois insertions étaient moins problématiques que de faire des sélections entre. En effet, les verrous sont moins longtemps présents. (Et quand nous insérons des données à chaque fois qu'un véhicule passe devant une cellule c'est important de diminuer la durée des verrous)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Appel de la séquence des personnes Appel de la séquence des adresses Requête pour récupérer le code du groupe par défaut Début de transaction Insertion dans la table des personnes des valeurs avec la séquence des personnes Insertion dans la table des groupes d'utilisateurs des valeurs obtenues avec la séquence des personnes et de la requête des groupes Insertion dans la table 3 des valeurs des séquences 1 et 2 Fin de transaction
Une autre utilité est pour certaines clefs plus "naturelles". L'autoincrémentation de Mysql simule en fait une séquence commençant à et avec un pas de 1. Nous avons parfois besoin d'avoir un pas différent. Il est rarement de 2 ou 3 ou quelquechose comme cela. Mais régulièrement nous avons besoin (pour des raisons historiques) de pas de -1.
(Une autre utilité des séquences vient dans le portage des procédures stockées de PostGreSQL à MySQL, le portage du code se simplifie car on a juste à rajouter un argument dans la fonction nextval, alors que sinon on doit parfois réfléchir à changer l'ordre de l'algortihme.)
PAr contre, ce que je trouve vraiment génial dans MySQL, c'est l'autoincrémentation sur une colonne secondaire ! Pour des notions de rang, c'est vraiment génial, et je n'arrive pas à le reproduire avec les séquences dans PostGreSQL.
Exemple de la documentation (regardez bien sur quoi porte la clef primaire)
Cela retourne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ); INSERT INTO animals (grp,name) VALUES("mammal","dog"),("mammal","cat"), ("bird","penguin"),("fish","lax"),("mammal","whale"), ("bird","ostrich"); SELECT * FROM animals ORDER BY grp,id;
Dans nos applications c'est utile. Imaginez notre table des tronçons d'autoroute. On ne gère pas dans mysql l'ordre. On balance nos scripts en classant juste les tronçons dans l'ordre, sans gérer les numéros, MySQL fait le reste. Dans PostGreSQL, on doit nous même inventer ces numéros ou mettre une séquence, qui ne fera pas attention à la première valeur de la table. (bref qui ne recommencera pas à 1 en somme, pour chaque autoroute)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+
salut,
en passant en revue la faq mysql, je n'y ai pas trouvé une entrée qui me paraissait pourtant simple et "frequente": comment mettre les données de mysql ailleurs que dans le répertoire par défaut (/var/lib/mysql) ?
il m'est arrivé un truc tt bete recemment : /var/lib/mysql était sur une partition systeme de taille modeste (c'est le cas sur la plupart des servers loués par defaut). Or en entame de nouveau projet qui fait appel à des volumes de données importants, j'ai saturé cette partition avec les données de mysql.
il me fallait donc déplacer le répertoire des données de mysql.
apres bon... je n'ai pas écrit une belle entrée de FAQ bien propre, je ne dis pas non plus que je saurais en écrire une qui marcherait sur tous les systemes,
mais si ca peut aider des gens, je veux bien en écrire une et la proposer ici
une telle entrée aurait-elle sa place dans la faq mysql ? ca interesse qqn ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager