需要通过varchar length()子串

时间:2013-07-08 09:50:20

标签: mysql substr

我需要按其长度对varchar进行子串。

select
substr('abcdefg', 1, 3),
substr('가나다라마바사', 1, 3)
from dual;

返回

en  ko
abc 가나다

但我需要的是

en  ko
abc 가

因为'abc'和'가'的长度是3。

希望有一个我正在寻找的功能。

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解问题是什么,但似乎您遇到与多字节字符相关的长度问题。

您可以使用LENGTH()来确定字符串长度,而不是CHAR_LENGTH()CHAR_LENGTH()考虑多字节字符(CHAR_LENGTH docs),其中LENGTH()以字节为单位返回字符串的长度。在您的情况下,韩语将有CHAR_LENGTH() = 7LENGTH() = 21(假设每个字符3个字节)

您可以使用FLOOR( CHAR_LENGTH() / LENGTH() * @desiredNumberOfBytes )的某种组合来返回与特定字节数相关的字符数,但这可能会导致非整数字符(因此使用FLOOR ,但也可以使用ROUNDCEILING

正如您已经看到的,SUBSTRING()已经是多字节安全的。

我担心,对于更具体的答案,我需要澄清你想要达到的目标。

答案 1 :(得分:1)

我会创建一个解决问题的函数:

DROP FUNCTION IF EXISTS BIT_SUBSTR;
DELIMITER //
CREATE FUNCTION BIT_SUBSTR(var TEXT,i INT,l INT) RETURNS TEXT
BEGIN
    DECLARE var2 TEXT;
    SET var2 = SUBSTR(var, i, (l/CAST(BIT_LENGTH(substr(var,1,1))/8 AS UNSIGNED)));
    RETURN var2;
END//
DELIMITER ;

然后你可以用SUBSTR代替它:

mysql> select BIT_SUBSTR('가나다라마바사', 1, 3), BIT_SUBSTR('abcdefg', 1, 3);
+-------------------------------------------+-----------------------------+
| BIT_SUBSTR('가나다라마바사', 1, 3)        | BIT_SUBSTR('abcdefg', 1, 3) |
+-------------------------------------------+-----------------------------+
| 가                                        | abc                         |
+-------------------------------------------+-----------------------------+
1 row in set (0.00 sec)