1

编辑:添加CHARSET utf8到输入参数和输出使其工作。我发现这个代码片段将每个单词的第一个字母转换为大写

DELIMITER $$
CREATE FUNCTION CAP_FIRST (INPUT VARCHAR(255) CHARSET utf8)

RETURNS VARCHAR(255) CHARSET utf8

DETERMINISTIC

BEGIN
    DECLARE len INT;
    DECLARE i INT;

    SET len   = CHAR_LENGTH(INPUT);
    SET INPUT = LOWER(INPUT);
    SET i = 0;

    WHILE (i < len) DO
        IF (MID(INPUT,i,1) = ' ' OR i = 0) THEN
            IF (i < len) THEN
                SET INPUT = CONCAT(
                    LEFT(INPUT,i),
                    UPPER(MID(INPUT,i + 1,1)),
                    RIGHT(INPUT,len - i - 1)
                );
            END IF;
        END IF;
        SET i = i + 1;
    END WHILE;

    RETURN INPUT;
END$$
DELIMITER ;

虽然它适用于 ascii 字符串;它不适用于 utf8

就像我做的那样select cap_first('tiếng việt');;我得到Ti?ng Vi?t了结果。

我的桌子在utf8_general_ci

4

1 回答 1

0

似乎您需要使用 SET NAMES 来告诉函数您正在使用什么字符集。尝试:

...
SET NAMES utf8 COLLATION utf8_general_ci;
SET len   = CHAR_LENGTH(INPUT);
...

手册参考:

来自http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

SET NAMES 指示客户端将使用什么字符集将 SQL 语句发送到服务器。因此,SET NAMES 'cp1251' 告诉服务器,“来自该客户端的未来传入消息在字符集 cp1251 中。” 它还指定服务器用于将结果发送回客户端的字符集。

不确定在这种情况下是否需要指定排序规则。

于 2013-07-24T17:59:24.770 回答