J'ai une table existante 'people_table', avec un champ full_name
.
De nombreux enregistrements ont le champ 'nom complet' rempli avec une casse incorrecte. par exemple. 'fred Jones'
ou 'fred jones'
ou 'Fred jones'
.
Je peux trouver ces entrées erronées avec:
SELECT * FROM people_table WHERE full_name REGEXP BINARY '^[a-z]';
Comment puis-je mettre en majuscule la première lettre de chaque mot trouvé? par exemple. 'fred jones'
devient 'Fred Jones'
.
Il n’existe pas de fonction MySQL pour cela, vous devez écrire la vôtre. Dans le lien suivant, il y a une implémentation:
http://joezack.com/index.php/2008/10/20/mysql-capitalize-function/
Pour l'utiliser, vous devez d'abord créer la fonction dans la base de données. Vous pouvez le faire, par exemple, avec le navigateur de requêtes MySQL (cliquez avec le bouton droit sur le nom de la base de données et sélectionnez Créer une nouvelle fonction).
Après avoir créé la fonction, vous pouvez mettre à jour les valeurs de la table avec une requête comme celle-ci:
UPDATE users SET name = CAP_FIRST(name);
Si vous ne devez l'exécuter qu'une seule fois et que vous ne voulez pas créer de fonction, vous pouvez faire quelque chose de vraiment harcodé comme:
UPDATE people_table SET full_name = LOWER(full_name);
UPDATE people_table SET full_name = CONCAT(UPPER(SUBSTR(full_name,1,1)),LOWER(SUBSTR(full_name,2)));
UPDATE people_table SET full_name = REPLACE(full_name,' a',' A');
UPDATE people_table SET full_name = REPLACE(full_name,' b',' B');
UPDATE people_table SET full_name = REPLACE(full_name,' c',' C');
UPDATE people_table SET full_name = REPLACE(full_name,' d',' D');
UPDATE people_table SET full_name = REPLACE(full_name,' e',' E');
UPDATE people_table SET full_name = REPLACE(full_name,' f',' F');
UPDATE people_table SET full_name = REPLACE(full_name,' g',' G');
UPDATE people_table SET full_name = REPLACE(full_name,' h',' H');
UPDATE people_table SET full_name = REPLACE(full_name,' i',' I');
UPDATE people_table SET full_name = REPLACE(full_name,' j',' J');
UPDATE people_table SET full_name = REPLACE(full_name,' k',' K');
UPDATE people_table SET full_name = REPLACE(full_name,' l',' L');
UPDATE people_table SET full_name = REPLACE(full_name,' m',' M');
UPDATE people_table SET full_name = REPLACE(full_name,' n',' N');
UPDATE people_table SET full_name = REPLACE(full_name,' o',' O');
UPDATE people_table SET full_name = REPLACE(full_name,' p',' P');
UPDATE people_table SET full_name = REPLACE(full_name,' q',' Q');
UPDATE people_table SET full_name = REPLACE(full_name,' r',' R');
UPDATE people_table SET full_name = REPLACE(full_name,' s',' S');
UPDATE people_table SET full_name = REPLACE(full_name,' t',' T');
UPDATE people_table SET full_name = REPLACE(full_name,' u',' U');
UPDATE people_table SET full_name = REPLACE(full_name,' v',' V');
UPDATE people_table SET full_name = REPLACE(full_name,' w',' W');
UPDATE people_table SET full_name = REPLACE(full_name,' x',' X');
UPDATE people_table SET full_name = REPLACE(full_name,' y',' Y');
UPDATE people_table SET full_name = REPLACE(full_name,' z',' Z');
Si vous souhaitez mettre tous les mots en majuscule, vous devrez invoquer une fonction custom .
-- may help:
-- DROP function if exists capitalize;
DELIMITER $$
CREATE FUNCTION `capitalize`(s varchar(255)) RETURNS varchar(255)
BEGIN
declare c int;
declare x varchar(255);
declare y varchar(255);
declare z varchar(255);
set x = UPPER( SUBSTRING( s, 1, 1));
set y = SUBSTR( s, 2);
set c = instr( y, ' ');
while c > 0
do
set z = SUBSTR( y, 1, c);
set x = CONCAT( x, z);
set z = UPPER( SUBSTR( y, c+1, 1));
set x = CONCAT( x, z);
set y = SUBSTR( y, c+2);
set c = INSTR( y, ' ');
end while;
set x = CONCAT(x, y);
return x;
END$$
DELIMITER ;
Maintenant tu fais comme ça:
UPDATE mytable SET thefield = capitalize(thefield);
DELIMITER $$
CREATE FUNCTION `capitalize`(s varchar(255)) RETURNS varchar(255)
BEGIN
declare c int;
declare x varchar(255);
declare y varchar(255);
declare z varchar(255);
set x = UPPER( SUBSTRING( s, 1, 1));
set y = lower(SUBSTR( s, 2));
set c = instr( y, ' ');
while c > 0
do
set z = SUBSTR( y, 1, c);
set x = CONCAT( x, z);
set z = UPPER( SUBSTR( y, c+1, 1));
set x = CONCAT( x, z);
set y = SUBSTR( y, c+2);
set c = INSTR( y, ' ');
end while;
set x = CONCAT(x, y);
return x;
END$$
DELIMITER ;
Create above function to set First character to capital of each words
J'ai essayé le code ci-dessus mais des erreurs de syntaxe ont été détectées sur la fonction. Je ne pouvais donc pas le créer. A écrit ceci pour la dernière version de MySQL s'il aide quelqu'un
CREATE FUNCTION `CAP_FIRST`(input VARCHAR(255)) RETURNS varchar(255) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE len INT;
DECLARE i INT;
DECLARE charnum INT;
declare SortedName varchar(255);
SET len = CHAR_LENGTH(input);
SET input = LOWER(input);
SET i = 1;
set charnum = 1;
set SortedName = '';
WHILE (i <= len) DO
if charnum = 1 then
set SortedName = concat(SortedName,upper(mid(input,i,1)));
set charnum = charnum + 1;
else
if mid(input,i,1) = ' ' then
set SortedName = concat(SortedName,' ');
set charnum = 1;
else
set SortedName = concat(SortedName,mid(input,i,1));
set charnum = charnum + 1;
end if;
end if;
SET i = i + 1;
END WHILE;
RETURN SortedName;
END
Voici deux fonctions utiles de Nicholas Thompson. Vous pouvez définir la 3ème variable de UC_DELEMITER sur false et la seconde sur "" pour la capitalisation de plusieurs mots.
UC_FIRST Majuscule une chaîne donnée - Cette fonction est un clone de la fonction ucfirst en PHP.
DROP FUNCTION IF EXISTS UC_FIRST;
CREATE FUNCTION UC_FIRST(oldWord VARCHAR(255)) RETURNS VARCHAR(255)
RETURN CONCAT(UCASE(SUBSTRING(oldWord, 1, 1)),SUBSTRING(oldWord, 2));
UC_DELIMITER Capitaliser avec un délimiteur entre les mots
DROP FUNCTION IF EXISTS UC_DELIMITER;
DELIMITER //
CREATE FUNCTION UC_DELIMITER(
oldName VARCHAR(255), delim VARCHAR(1), trimSpaces BOOL
)
RETURNS VARCHAR(255)
BEGIN
SET @oldString := oldName;
SET @newString := "";
tokenLoop: LOOP
IF trimSpaces THEN SET @oldString := TRIM(BOTH " " FROM @oldString); END IF;
SET @splitPoint := LOCATE(delim, @oldString);
IF @splitPoint = 0 THEN
SET @newString := CONCAT(@newString, UC_FIRST(@oldString));
LEAVE tokenLoop;
END IF;
SET @newString := CONCAT(@newString, UC_FIRST(SUBSTRING(@oldString, 1, @splitPoint)));
SET @oldString := SUBSTRING(@oldString, @splitPoint+1);
END LOOP tokenLoop;
RETURN @newString;
END//
DELIMITER ;
Exemples:
SELECT UC_DELIMITER('eric-leroy','-',TRUE);
Eric-Leroy
Si vous utilisez PHP, alors ...
try{
$con = new PDO("mysql:Host=localhost;dbname=dbasename", "root", "");
}
catch(PDOException $e){
echo "error" . $e-getMessage();
}
$select = $con->prepare("SELECT * FROM table");
$select->setFetchMode(PDO::FETCH_ASSOC);
$select->execute();
while($data=$select->fetch()) {
$id = $data['id'];
$column = $data['column'];
$column = ucwords(strtolower($column)); // Capitalize each Word
$update = $con->prepare("UPDATE table SET column=:column WHERE id='$id'");
$update->bindParam(':column', $column);
$update->execute();
}
Simplement:
SELECT
CONCAT(UCASE(LEFT(firstname, 1)), LCASE(SUBSTRING(firstname, 2))) as firstname
FROM PEOPLE
Le Propre fonction dans Excel (ou Google feuilles fait exactement ce que vous voulez.
Exportez donc votre table mysql en tant que CSV et dans Excel (ou feuilles de Google). Puis utilisez = Proper(*text_to_capitalize*)
pour mettre en majuscule la première lettre de chaque mot.
Exportez ensuite cette feuille Excel au format CSV dans votre base de données.