2015-03-02 28 views
0

定界符好好尝试一下工作拆分字符串这是一个成功的抓住了单线条勾勒出字符串的函数,直到它与一些波兰特殊字符MySQL的功能与波兰特殊字符

DELIMITER $$ 
DROP FUNCTION SPLIT_STR $$ 

CREATE FUNCTION SPLIT_STR(x VARCHAR(1500) CHARSET utf8 COLLATE utf8_unicode_ci, delim VARCHAR(12) CHARSET utf8 COLLATE utf8_unicode_ci, pos INTEGER) 
RETURNS VARCHAR(500) CHARSET utf8 COLLATE utf8_unicode_ci 
BEGIN 
    DECLARE output VARCHAR(1500) CHARSET utf8 COLLATE utf8_unicode_ci; 
    SET output = REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos) 
       , LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) + 1) 
       , delim 
       , ''); 
    RETURN output; 
END $$ 

正如你可以看到文本,我手动设置字符集和整理(与整个数据库使用相同)。我也试过没有字符集和整理设置,它不起作用。

输出重现(这就是它是如何存储在数据库作为一个字段):

śńąśąńśąńśąńóńśńąśąńśąńśąńóń 
śńąśąńśąńśąńóń 
sas 

这样做

SELECT 
SPLIT_STR(slides.content1, '\n', 1), 
SPLIT_STR(slides.content1, '\n', 2), 
SPLIT_STR(slides.content1, '\n', 3), 

我实际上只得到了第一行(其他2个字段为空)

śńąśąńśąńśąńóńśńąśąńśąńśąńóń 
+1

我猜你想用'CHAR_LENGTH()'替换'LENGTH()'。 – 2015-03-02 19:02:56

+0

宾果!随意发布它作为答案,我会接受它。也谢谢你! – 2015-03-02 19:09:57

回答

1

CHAR_LENGTH()返回字符长度,而LENGTH()返回以字节为单位的长度。当您打算处理字符长度时,尤其是在处理多字节字符集时,您应该始终使用CHAR_LENGTH(),其中两个函数的结果可能不同。

在你的函数中用CHAR_LENGTH()代替LENGTH()可能会解决这个问题。