Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2012, 13h54   #1
Membre du Club
 
Inscription : juillet 2005
Messages : 245
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 245
Points : 46
Points : 46
Par défaut Syntaxe SQL / fonction initcap

Bonjour,

Je crée une table (person) de personnes avec des champs nom, prénom, ...
Sur le champ prénom, je met une contrainte pour s'assurer que la première lettre du prénom est une majuscule :
Code :
1
2
3
...
pers_surname	VARCHAR(20)		NOT NULL	CHECK (pers_surname = INITCAP(pers_surname))										 ,
...
J'ai un problème si je fais un insert avec un prénom contenant une lettre accentuée (Agnès):
Code :
1
2
3
4
5
6
ERROR:  new row FOR relation "person" violates CHECK constraint "person_pers_surname_check"
 
********** Error **********
 
ERROR: new row FOR relation "person" violates CHECK constraint "person_pers_surname_check"
SQL state: 23514
comment faire ?
Merci,
Nico
DiverSIG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 14h02   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,

Quel est votre sgbd ?

Peut-on avoir l'insert que vous effectuez ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 14h09   #3
Membre du Club
 
Inscription : juillet 2005
Messages : 245
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 245
Points : 46
Points : 46
je suis sous postgresql 8.4.

la création de la table :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE person
(
	pers_id			INTEGER			NOT NULL	UNIQUE																				 ,
	pers_name		VARCHAR(20)		NOT NULL	CHECK (pers_name = UPPER(pers_name))												 ,
	pers_surname	VARCHAR(20)		NOT NULL	CHECK (pers_surname = INITCAP(pers_surname))										 ,
	pers_organism	VARCHAR(75)		NOT NULL																						 ,
	pers_status		VARCHAR(30)		NOT NULL	CHECK (pers_status IN ('Stagiaire','Ingénieur','Chercheur','Technicien','Capitaine')),
	pers_missions	VARCHAR(150)																									 ,
	pers_adress		VARCHAR(100)																									 ,
	pers_cp			VARCHAR(5)																										 ,
	pers_town		VARCHAR(30)																										 ,
	pers_phone		VARCHAR(14)																										 ,
	pers_mail		VARCHAR(80)																										 ,
	commentaire		VARCHAR(65535)																									 ,
	CONSTRAINT pk_person PRIMARY KEY (pers_id)
);
CREATE UNIQUE INDEX idx_person_id ON person (pers_id ASC);
l'insert :
Code :
INSERT INTO person (pers_id, pers_name, pers_surname, pers_organism, pers_status, pers_missions, pers_adress, pers_cp, pers_town, pers_mail) VALUES (18, 'BURGEON', 'Agnès', 'MonLabo', 'Technicien', 'Terrain automne 2006', 'Mon Adresse', 'cp', 'MaVille', 'Mon Mail');
Nico
DiverSIG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 14h40   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Je suspect un problème d'encodage de votre base.

Quelle valeur avez-vous dans ENCODING et LC_CTYPE ?

Ensuite pouvez-vous tester ceci ?

Code :
1
2
 
SELECT upper('é'), initcap('éd')
Je n'ai jamais poussé mes recherche bien loin la dedans mais regardez dans la doc officielle.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 14h59   #5
Membre du Club
 
Inscription : juillet 2005
Messages : 245
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 245
Points : 46
Points : 46
Code :
1
2
3
ENCODING = 'SQL_ASCII'
LC_COLLATE = 'C'
LC_CTYPE = 'C'

réponse de la requête select :
ça veut dire qu'il ne prend pas en compte les lettres accentuées ? Mais dans mon cas, la lettre accentuée n'est pas en début de mot ...

Nico
DiverSIG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 15h15   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
bein faites un select initcap('réd'), le résutlat sera le même.


Si vous refaites ces même tests avec le paramétrages suivant par exemple, le résultat sera différent.
Code :
1
2
3
4
 
ENCODING = 'UTF8'
LC_COLLATE = 'French_France.1252'
LC_CTYPE = 'French_France.1252'
Bref creusez dans ce sens.

En particulier :
Citation:
SQL_ASCII se comporte de façon considérablement différente des autres valeurs. Quand le jeu de caractères du serveur est SQL_ASCII, le serveur interprète les valeurs des octets 0-127 suivant le standard ASCII alors que les valeurs d'octets 128-255 sont considérées comme des caractères non interprétés. Aucune conversion de codage n'est effectuée avec SQL_ASCII. De ce fait, cette valeur ne déclare pas tant un encodage spécifique que l'ignorance de l'encodage. Dans la plupart des cas, si des données non ASCII doivent être traitées, il est déconseillé d'utiliser la valeur SQL_ASCII car PostgreSQL™ est alors incapable de convertir ou de valider les caractères non ASCII.
Donc les accents ...
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h42.


 
 
 
 
Partenaires

Hébergement Web