MySQL - 在现有表中大写每个单词的首字母

Sir*_*tty 26 mysql capitalization

我有一个现有的表'people_table',带有一个字段full_name.

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

我可以找到这些错误的条目:

SELECT * FROM people_table WHERE full_name REGEXP BINARY '^[a-z]';
Run Code Online (Sandbox Code Playgroud)

如何将每个单词的第一个字母大写?例如'fred jones'成为'Fred Jones'.

Vin*_*nto 56

没有MySQL功能,你必须自己编写.在以下链接中有一个实现:

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

为了使用它,首先需要在数据库中创建该函数.例如,您可以使用MySQL Query Browser(右键单击数据库名称并选择Create new Function)来执行此操作.

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

UPDATE users SET name = CAP_FIRST(name);
Run Code Online (Sandbox Code Playgroud)


gle*_*gui 32

如果你只需要运行一次,并且你不想创建一个函数,那么你可以做一些非常强大的事情:

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');
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案.简单.不需要创建功能 (7认同)
  • `UPDATE people_table SET full_name = 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'),'我','我'),'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 ")` (4认同)
  • @BenjF 笑得停不下来 (3认同)
  • 那么这个快速解决方案不能解决你的问题,你必须使用一个函数,但这并不会让它成为一个“糟糕的代码”。如果您真正的问题只是西里尔文或拉丁文,您可以添加这些大写字符,因为没有那么多,并且对于中文大写字母来说,可以在常规单词上进行交换。 (3认同)
  • 一个聪明的解决方案! (2认同)

Ser*_*reu 16

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

-- 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 ;
Run Code Online (Sandbox Code Playgroud)

现在你这样做:

 UPDATE mytable SET thefield = capitalize(thefield);
Run Code Online (Sandbox Code Playgroud)

  • 这只会修复第一个单词,而不是整个字符串.例如"fred jones"=>"Fred jones".应该去"弗雷德琼斯". (5认同)

Eri*_*roy 5

这是 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));
Run Code Online (Sandbox Code Playgroud)

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 ;
Run Code Online (Sandbox Code Playgroud)

例子:

SELECT UC_DELIMITER('eric-leroy','-',TRUE);
Eric-Leroy  
Run Code Online (Sandbox Code Playgroud)

函数的网页