我想正确地将名称大写,在这种情况下意味着:
第一个和最后一个要求很容易处理:
CONCAT(LEFT(name, 1), LOWER(RIGHT(name, LENGTH(name) - 1)))
其他人更难。我写了一个54次嵌套的REPLACE语句(当然不是手工,我使用Excel)
REPLACE(REPLACE(REPLACE(REPLACE(...,' b',' B'),'-b','-B'),' a',' A'),'-a','-A')
但我觉得必须有一个更优雅和可维护的解决方案。有什么想法吗?
如果内置函数与我的要求相似但不完全相同,则可能没问题。
编辑:此脚本只会在已经丢失大小写的名称上运行,因此错误处理模糊名称不会有任何危险。但是处理像空格和破折号这样的撇号会很好。浏览当前数据可以看出,许多(约30%)的名字至少有一个[ - ']。
答案 0 :(得分:4)
“Van den Berg”(小写'd')怎么样?那么“麦当劳”或“奥莱利”。
过度验证人们的名字通常被认为是一个坏主意,因为总会有一个合法的名称会破坏你的验证。
另请参阅我之前对类似问题的回答:How to "Validate" Human Names in CakePHP?
答案 1 :(得分:2)
代码遇到失败后发布的内容无法正常运行...它正确地将字符串中的第一个和最后一个单词大写,并删除其间的任何内容(如果有> 2)。有人在他发布的网址上发布了更正版本...
(见Matt Cavanaugh在2009年5月15日下午3:52发表于http://dev.mysql.com/doc/refman/5.1/en/string-functions.html的帖子)
答案 2 :(得分:1)
它不会很漂亮,但您可以使用SUBSTRING_INDEX
来查找第一个空格和破折号,并有条件地将任何成功资本化。
答案 3 :(得分:1)
您可以使用用户定义的函数,这将更容易重用。
答案 4 :(得分:1)
看起来MySQL没有INITCAP功能,但我在这里找到了一个代码:
http://dev.mysql.com/doc/refman/5.1/en/string-functions.html
代码也是:
DELIMITER $$
DROP FUNCTION IF EXISTS `initcap` $$
CREATE FUNCTION `initcap`(x char(30)) RETURNS char(30) CHARSET utf8
BEGIN
SET @str='';
SET @l_str='';
WHILE x REGEXP ' ' DO
SELECT SUBSTRING_INDEX(x, ' ', 1) INTO @l_str;
SELECT SUBSTRING(x, LOCATE(' ', x)+1) INTO x;
SELECT CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(@l_str,1,1)),LOWER(SUBSTRING(@l_str,2)))) INTO @str;
END WHILE;
RETURN LTRIM(CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(x,1,1)),LOWER(SUBSTRING(x,2)))));
END $$
DELIMITER ;
免责声明:我没有写这段代码,我甚至没有测试过它......