Odpowiedzi:
To prawie to samo, wystarczy zmienić, aby użyć funkcji CONCAT () zamiast operatora +:
UPDATE tb_Company
SET CompanyIndustry = CONCAT(UCASE(LEFT(CompanyIndustry, 1)),
SUBSTRING(CompanyIndustry, 2));
To zamieniłoby hello
się w Hello
, wOrLd
do WOrLd
, BLABLA
do BLABLA
itd. Jeśli chcesz pisać wielką literą pierwszą literę, a małą drugą, wystarczy użyć funkcji LCASE:
UPDATE tb_Company
SET CompanyIndustry = CONCAT(UCASE(LEFT(CompanyIndustry, 1)),
LCASE(SUBSTRING(CompanyIndustry, 2)));
Zauważ, że UPPER i UCASE robią to samo.
Vincents doskonała odpowiedź na wielkie litery Pierwszego Listu działa świetnie na pierwszej literze tylko kapitalizacja całej kolumny ciąg ..
ALE co, jeśli chcesz, aby pierwsza litera KAŻDEGO słowa była pisana wielką literą w ciągach kolumny tabeli?
np. „Abbeville High School”
Nie znalazłem odpowiedzi na to pytanie w Stackoverflow. Musiałem zebrać razem kilka odpowiedzi, które znalazłem w Google, aby zapewnić solidne rozwiązanie powyższego przykładu. Nie jest to funkcja natywna, ale funkcja utworzona przez użytkownika, na którą pozwala MySQL w wersji 5+.
Jeśli masz status użytkownika Super / Admin na MySQL lub lokalną instalację mysql na swoim komputerze, możesz stworzyć FUNKCJĘ (taką jak procedura składowana), która będzie znajdować się w Twojej bazie danych i będzie używana we wszystkich przyszłych zapytaniach SQL w dowolnej części db.
Funkcja, którą utworzyłem, pozwala mi używać tej nowej funkcji, którą nazwałem „UC_Words”, podobnie jak wbudowanych funkcji natywnych MySQL, dzięki czemu mogę zaktualizować całą kolumnę w następujący sposób:
UPDATE Table_name
SET column_name = UC_Words(column_name)
Aby wstawić kod funkcji, zmieniłem standardowy separator MySQL (;) podczas tworzenia funkcji, a następnie przywróciłem go do normalnego po skrypcie tworzenia funkcji. Osobiście chciałem również, aby wyjście było w UTF8 CHARSET.
Tworzenie funkcji =
DELIMITER ||
CREATE FUNCTION `UC_Words`( str VARCHAR(255) ) RETURNS VARCHAR(255) CHARSET utf8 DETERMINISTIC
BEGIN
DECLARE c CHAR(1);
DECLARE s VARCHAR(255);
DECLARE i INT DEFAULT 1;
DECLARE bool INT DEFAULT 1;
DECLARE punct CHAR(17) DEFAULT ' ()[]{},.-_!@;:?/';
SET s = LCASE( str );
WHILE i < LENGTH( str ) DO
BEGIN
SET c = SUBSTRING( s, i, 1 );
IF LOCATE( c, punct ) > 0 THEN
SET bool = 1;
ELSEIF bool=1 THEN
BEGIN
IF c >= 'a' AND c <= 'z' THEN
BEGIN
SET s = CONCAT(LEFT(s,i-1),UCASE(c),SUBSTRING(s,i+1));
SET bool = 0;
END;
ELSEIF c >= '0' AND c <= '9' THEN
SET bool = 0;
END IF;
END;
END IF;
SET i = i+1;
END;
END WHILE;
RETURN s;
END ||
DELIMITER ;
Działa to bardzo przyjemnie, wyświetlając pierwsze wielkie litery w wielu słowach w ciągu.
Zakładając, że Twoja nazwa użytkownika logowania MySQL ma wystarczające uprawnienia - jeśli nie, i nie możesz skonfigurować tymczasowej bazy danych na swoim osobistym komputerze, aby konwertować tabele, zapytaj swojego współdzielonego dostawcę hostingu, czy ustawi tę funkcję za Ciebie.
CHARSET utf8_general_ci
należy zmienić na CHARSET utf8
(przynajmniej w dniu 5.7)
Illegal mix of collations for operation 'concat'
więc myślę, że po prostu napraw zestaw znaków lub usuń go i ustaw go jako domyślny.
Można użyć kombinacji UCASE()
, MID()
i CONCAT()
:
SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names;
SELECT CONCAT(UCASE(MID('TEST',1,1)),MID('TEST',2));
mysql> SELECT schedule_type AS Schedule FROM ad_campaign limit 1;
+----------+
| Schedule |
+----------+
| ENDDATE |
+----------+
1 row in set (0.00 sec)
mysql> SELECT CONCAT(UCASE(MID(schedule_type,1,1)),LCASE(MID(schedule_type,2))) AS Schedule FROM ad_campaign limit 1;
+----------+
| Schedule |
+----------+
| Enddate |
+----------+
1 row in set (0.00 sec)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_mid
http://forge.mysql.com/tools/tool.php?id=201
Jeśli w kolumnie jest więcej niż 1 słowo, to nie zadziała, jak pokazano poniżej. Wspomniany wyżej UDF może w takiej sytuacji pomóc.
mysql> select * from names;
+--------------+
| name |
+--------------+
| john abraham |
+--------------+
1 row in set (0.00 sec)
mysql> SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names;
+--------------+
| name |
+--------------+
| John abraham |
+--------------+
1 row in set (0.00 sec)
A może ten pomoże ...
To działa dobrze.
UPDATE state SET name = CONCAT(UCASE(LEFT(name, 1)), LCASE(SUBSTRING(name, 2)));
UPDATE tb_Company SET CompanyIndustry = UCASE(LEFT(CompanyIndustry, 1)) +
SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry))
Jeśli ktoś spróbuje zapisać każde słowo wielką literą, oddzielając je spacją ...
CREATE FUNCTION response(name VARCHAR(40)) RETURNS VARCHAR(200) DETERMINISTIC
BEGIN
set @m='';
set @c=0;
set @l=1;
while @c <= char_length(name)-char_length(replace(name,' ','')) do
set @c = @c+1;
set @p = SUBSTRING_INDEX(name,' ',@c);
set @k = substring(name,@l,char_length(@p)-@l+1);
set @l = char_length(@k)+2;
set @m = concat(@m,ucase(left(@k,1)),lcase(substring(@k,2)),' ');
end while;
return trim(@m);
END;
CREATE PROCEDURE updateNames()
BEGIN
SELECT response(name) AS name FROM names;
END;
Wynik
+--------------+
| name |
+--------------+
| Abdul Karim |
+--------------+
To powinno dobrze działać:
UPDATE tb_Company SET CompanyIndustry =
CONCAT(UPPER(LEFT(CompanyIndustry, 1)), SUBSTRING(CompanyIndustry, 2))
UPDATE users
SET first_name = CONCAT(UCASE(LEFT(first_name, 1)),
LCASE(SUBSTRING(first_name, 2)))
,last_name = CONCAT(UCASE(LEFT(last_name, 1)),
LCASE(SUBSTRING(last_name, 2)));
select CONCAT(UCASE(LEFT('CHRIS', 1)),SUBSTRING(lower('CHRIS'),2));
Powyższe wyrażenie może być użyte jako pierwsze litery DUŻE, a pozostałe jako małe.
Uso algo simples assim;)
DELIMITER $$
DROP FUNCTION IF EXISTS `uc_frist` $$
CREATE FUNCTION `uc_frist` (str VARCHAR(200)) RETURNS varchar(200)
BEGIN
set str:= lcase(str);
set str:= CONCAT(UCASE(LEFT(str, 1)),SUBSTRING(str, 2));
set str:= REPLACE(str, ' a', ' A');
set str:= REPLACE(str, ' b', ' B');
set str:= REPLACE(str, ' c', ' C');
set str:= REPLACE(str, ' d', ' D');
set str:= REPLACE(str, ' e', ' E');
set str:= REPLACE(str, ' f', ' F');
set str:= REPLACE(str, ' g', ' G');
set str:= REPLACE(str, ' h', ' H');
set str:= REPLACE(str, ' i', ' I');
set str:= REPLACE(str, ' j', ' J');
set str:= REPLACE(str, ' k', ' K');
set str:= REPLACE(str, ' l', ' L');
set str:= REPLACE(str, ' m', ' M');
set str:= REPLACE(str, ' n', ' N');
set str:= REPLACE(str, ' o', ' O');
set str:= REPLACE(str, ' p', ' P');
set str:= REPLACE(str, ' q', ' Q');
set str:= REPLACE(str, ' r', ' R');
set str:= REPLACE(str, ' s', ' S');
set str:= REPLACE(str, ' t', ' T');
set str:= REPLACE(str, ' u', ' U');
set str:= REPLACE(str, ' v', ' V');
set str:= REPLACE(str, ' w', ' W');
set str:= REPLACE(str, ' x', ' X');
set str:= REPLACE(str, ' y', ' Y');
set str:= REPLACE(str, ' z', ' Z');
return str;
END $$
DELIMITER ;