MySQL函数通过分隔符来分割字符串,并使用波兰语特殊字符

时间:2015-03-02 18:18:23

标签: 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 $$

如您所见,我手动设置charset和collat​​ion(与整个数据库使用的相同)。我也尝试过没有字符集和整理设置,但它不起作用。

要重现的输出(将其作为单个字段存储在数据库中的方式):

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

通过

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

我实际上只获得第一行(其他两个字段为空)

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

1 个答案:

答案 0 :(得分:1)

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

在您的函数中使用LENGTH()替换CHAR_LENGTH()可能会解决问题。