这是一个功能,可以成功地从字符串中抓取单行,直到它是带有一些波兰语特殊字符的文本
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和collation(与整个数据库使用的相同)。我也尝试过没有字符集和整理设置,但它不起作用。
要重现的输出(将其作为单个字段存储在数据库中的方式):
śńąśąńśąńśąńóńśńąśąńśąńśąńóń
śńąśąńśąńśąńóń
sas
通过
SELECT
SPLIT_STR(slides.content1, '\n', 1),
SPLIT_STR(slides.content1, '\n', 2),
SPLIT_STR(slides.content1, '\n', 3),
我实际上只获得第一行(其他两个字段为空)
śńąśąńśąńśąńóńśńąśąńśąńśąńóń
答案 0 :(得分:1)
CHAR_LENGTH()
以字符为单位返回长度,而LENGTH()
以字节为单位返回长度。当您打算处理字符长度时,尤其是在处理多字节字符集时,应始终使用CHAR_LENGTH()
,其中两个函数之间的结果可能不同。
在您的函数中使用LENGTH()
替换CHAR_LENGTH()
可能会解决问题。