【问题标题】:Capitalize first letter of each word, in existing table将现有表中每个单词的首字母大写
【发布时间】:2010-07-19 03:00:39
【问题描述】:

我有一个现有的表“people_table”,其中包含一个字段full_name

许多记录的“full_name”字段填充了错误的大小写。例如'fred Jones''fred jones''Fred jones'

我可以通过以下方式找到这些错误条目:

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

如何将找到的每个单词的首字母大写?例如'fred jones' 变为 'Fred Jones'

【问题讨论】:

    标签: mysql capitalization


    【解决方案1】:

    没有 MySQL 函数可以做到这一点,您必须自己编写。在以下链接中有一个实现:

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

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

    创建函数后,您可以使用如下查询更新表中的值:

    UPDATE users SET name = CAP_FIRST(name);
    

    【讨论】:

    • 感谢您的帮助。我不确定如何使用此功能来更新我已有的记录。 (恐怕我是 MySQL 菜鸟。)
    • 我编辑后发布,添加了有关如何使用该功能的信息。
    • 非常感谢维尼修斯!我会尝试这种方法。
    【解决方案2】:

    如果您只需要运行一次,并且不想创建函数,则可以执行以下代码:

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

    【讨论】:

    • 这是最好的答案。简单的。不需要创建函数
    • 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(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'),' l',' L'),' m',' M'),' n',' N'),' o',' O'),' p',' P'),' q',' Q'),' r',' R'),' s',' S'),' t',' T'),' u',' U'),' v',' V'),' w',' W'),' x',' X'),' y',' Y'),' z',' Z')
    • @BenjF 笑得停不下来
    • 糟糕的代码。如果我将 Unicode 与西里尔文、中文等字符一起使用会发生什么???
    • 那么这个快速解决方案并不能解决你的问题,你必须使用一个函数,但这不会使它成为一个“糟糕的代码”。如果您真正的问题只是西里尔语或拉丁语,您可以添加这些大写字符,因为没有那么多,而且对于中文大写字母可以在常规单词上交换。
    【解决方案3】:

    如果您想将所有单词大写,则需要调用自定义函数

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

    【讨论】:

    • 这只会修复第一个单词,而不是整个字符串。例如“弗雷德琼斯”=>“弗雷德琼斯”。应该选“弗雷德·琼斯”。
    【解决方案4】:

    以下是 Nicholas Thompson 的两个有用函数。您可以将 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

    【讨论】:

    • 这是一个很好的解决方案
    【解决方案5】:

    我尝试了上面的代码,但函数有语法错误,所以无法创建它。如果对任何人有帮助,请为最新版本的 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
    

    【讨论】:

    • 谢谢大家 - 这真的很有帮助。
    • 我仍然得到:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 4 行的 '' 附近使用”
    【解决方案6】:

    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

    【讨论】:

      【解决方案7】:

      简单地说:

      SELECT
      CONCAT(UCASE(LEFT(firstname, 1)), LCASE(SUBSTRING(firstname, 2))) as firstname
      FROM PEOPLE
      

      【讨论】:

      • 这只会将名字大写(不是按要求找到的每个单词)
      【解决方案8】:

      如果它是一个计时器,则无需创建函数。以下工作正常:

      -- Capitalize first letter of each word in r.name field
      SELECT TRIM(CONCAT(
         CONCAT(UPPER(SUBSTRING(cname1,1,1)),SUBSTRING(cname1,2)) , " ",
         CONCAT(UPPER(SUBSTRING(cname2,1,1)),SUBSTRING(cname2,2)) , " ",
         CONCAT(UPPER(SUBSTRING(cname3,1,1)),SUBSTRING(cname3,2))))
      FROM (
         SELECT
           @num_spaces := 1 + LENGTH(c_name) - LENGTH(REPLACE(c_name, ' ', '')) AS 
           num_spaces,
           SUBSTRING_INDEX(CONVERT(c_name,CHAR), ' ', 1) AS cname1,
           IF(@num_spaces > 1, SUBSTRING_INDEX(SUBSTRING_INDEX(c_name, ' ', 2), ' ', -1), '') AS cname2,
           IF(@num_spaces > 2, SUBSTRING_INDEX(SUBSTRING_INDEX(c_name, ' ', 3), ' ', -1), '') AS cname3
           FROM (SELECT (CASE 
              WHEN UPPER(r.name)COLLATE latin1_general_cs =r.name THEN LOWER(TRIM(r.name))
              ELSE TRIM(r.name)
              END) AS c_name,r.name
              FROM table r) cr) ncr;
      

      注意: IF 子句应等于或大于@num_spaces 的值。当前的 sql 将处理最多 3 个单词。如果需要,您可以添加更多。

      【讨论】:

        【解决方案9】:

        首先创建一个函数

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

        然后使用这个查询

        UPDATE mytable SET thefield = UC_FIRST(thefield);
        

        【讨论】:

          【解决方案10】:

          Eric Leroy 的回答是这里最有趣的回答,但它遗漏了两件事:

          • UC_FIRST 函数中的小写:如果要将单词的第一个字母大写,则意味着您也希望其他字母为小写。它适用于完整的小写条目,但如果在条目中出现混合大小写,例如«wOrD»,当您需要«Word»时,您会得到«WOrD»。
          • 根据 mysql 版本和配置,您可能需要在函数定义中使用确定性关键字。

          这是创建函数的更新代码:

          DROP FUNCTION IF EXISTS UC_FIRST;
          CREATE FUNCTION UC_FIRST(oldWord VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC
          RETURN CONCAT(UCASE(SUBSTRING(oldWord, 1, 1)),LCASE(SUBSTRING(oldWord, 2)));
          
          DROP FUNCTION IF EXISTS UC_DELIMITER;
          DELIMITER //
          CREATE FUNCTION UC_DELIMITER(
             oldName VARCHAR(255), delim VARCHAR(1), trimSpaces BOOL
          ) 
            RETURNS VARCHAR(255) DETERMINISTIC
          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('ThIs IS an ExAMplE oF MIxeD CaseS sTRing',' ',TRUE);
          

          你会得到:

          This Is An Example Of Mixed Cases String
          

          【讨论】:

            【解决方案11】:

            在 phpmyadmin 上,运行 UPDATE table_name SET Column_Name = LOWER(Column_Name) 然后在显示数据库表数据的 html 页面中使用 css text-transform: capitalize;

            【讨论】:

              【解决方案12】:

              Excel 中的 Proper 函数(或 google 表格完全符合您的要求。

              因此,将您的 mysql 表导出为 CSV 并导入 Excel(或谷歌表格)。然后使用= Proper(*text_to_capitalize*) 将每个单词的首字母大写。

              然后只需将该 Excel 工作表以 CSV 格式导出回您的数据库。

              【讨论】:

                【解决方案13】:

                如果您使用的是 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();
                }
                

                【讨论】:

                • 这个问题专门针对 MySQL 方法。在 MySQL 中这样做的价值在于它可以在任何编程语言中完成。它也可以用于数据视图和衍生列等。 PHP 确实可以处理,但是这里的 PHP 解决方案不是解决方案。
                猜你喜欢
                • 2015-11-10
                • 2020-08-30
                • 2015-11-04
                • 2012-11-11
                • 2012-07-24
                • 2016-12-05
                • 2015-12-10
                • 2017-08-02
                • 2013-12-15
                相关资源
                最近更新 更多