2010-07-19 129 views
22

我有一个现有的表'people_table',字段full_nameMySQL - 在现有表中大写每个单词的第一个字母

许多记录具有填充了不正确套管的“full_name”字段。例如'fred Jones''fred jones''Fred jones'

我能找到这些错误的条目:

SELECT * FROM people_table WHERE full_name REGEXP BINARY '^[a-z]'; 

我怎么能为每个字的第一个字母发现了什么?例如'fred jones'变成'Fred Jones'

回答

51

有没有MySQL的功能来做到这一点,你必须自己写。在下面的链接有一个实现:

http://joezack.com/index.php/2008/10/20/mysql-capitalize-function/

为了使用它,首先你需要在数据库中创建的功能。例如,您可以使用MySQL查询浏览器(右键单击数据库名称并选择创建新函数)。

创建功能后,你可以用这样的查询更新表中的值:

UPDATE users SET name = CAP_FIRST(name); 
+1

谢谢您的帮助。我不知道如何使用此功能来更新我已有的记录。 (我是一个MySQL noob,恐怕。) – SirRatty 2010-07-19 03:40:26

+1

我编辑发布,添加关于如何使用该功能的信息。 – 2010-07-19 17:53:07

+0

非常感谢Vinicius!我会尝试这种方法。 – SirRatty 2010-07-20 02:33:19

13

如果你想利用所有的话,这将需要调用自定义函数

-- 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 ; 

现在你做的是这样的:

UPDATE mytable SET thefield = capitalize(thefield); 
+5

这将只修复第一个单词,而不是整个字符串。例如“弗雷德琼斯”=>“弗雷德琼斯”。应该去“弗雷德琼斯”。 – jamesthollowell 2015-08-31 13:37:31

+0

你是对的,改变我的帖子。 – 2017-01-27 19:09:16

4

我试图将代码从以上,但对功能有语法错误,所以无法创建它。写到这对MySQL的最新版本,如果它可以帮助任何人

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 
+0

谢谢你们 - 这真的很有帮助。 – Scott 2015-11-10 04:32:56

22

如果你需要运行它只是一个时间,你不希望创建一个功能,你可以做一些真正-harcoded为:

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'); 
+6

这是最好的答案。简单。不需要创建功能 – 2015-11-07 20:35:38

+2

聪明的解决方案! – 2016-02-16 14:05:01

+2

'UPDATE people_table SET FULL_NAME = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE '替换(替换(CONCAT(UPPER(SUBSTR(full_name,1,1)),LOWER(SUBSTR(full_name,2))),'a','A'),'b','B' ),'c','C'),'d','D'),'e','E'),'f','F'),'g','G'),'h' ,H'),'I','I'),'j','J'),'k','K'),'1','L'),'m','M') '''','''','''''''''''''''''''''''''''''''''''''''''''' ''','t','T'),'u','U'),'v','V'),'w','W'),'x','X'), 'y','Y'),'z','Z')' – 2016-04-16 00:00:23

2

这是尼古拉斯汤普森的两个有用的功能。您可以将UC_DELEMITER的第三个变量设置为false,将第二个变量设置为多个单词大写的“”。

UC_FIRST 大写任何给定的字符串 - 此功能在PHP的ucfirst功能的克隆。

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用定界符大写在字的例子之间

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 ; 

SELECT UC_DELIMITER('eric-leroy','-',TRUE); 
Eric-Leroy 

Function's Webpage

+0

工作过!非常感谢:) – 2016-06-30 04:45:52

+0

这是一个很好的解决方案 – 2016-07-21 10:44:43

-1

上的phpmyadmin,运行这UPDATE table_name SET Column_Name = LOWER(Column_Name) 然后在从数据库表使用CSS text-transform: capitalize;

0

正确功能在Excel(或谷歌表显示数据的HTML页面,不正是你想要的。

因此,将你的mysql表格导出为CSV并导入到Excel(或Google表格)中。然后使用= Proper(*text_to_capitalize*)来大写每个单词的第一个字母。

然后,只需将该Excel表格导出为CSV数据到您的数据库。

0

如果你正在使用PHP然后...

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(); 
} 
3

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

相关问题