我需要按其长度对varchar进行子串。
select
substr('abcdefg', 1, 3),
substr('가나다라마바사', 1, 3)
from dual;
返回
en ko
abc 가나다
但我需要的是
en ko
abc 가
因为'abc'和'가'的长度是3。
希望有一个我正在寻找的功能。
答案 0 :(得分:1)
我不确定我是否理解问题是什么,但似乎您遇到与多字节字符相关的长度问题。
您可以使用LENGTH()
来确定字符串长度,而不是CHAR_LENGTH()
。 CHAR_LENGTH()
考虑多字节字符(CHAR_LENGTH docs),其中LENGTH()
以字节为单位返回字符串的长度。在您的情况下,韩语将有CHAR_LENGTH() = 7
但LENGTH() = 21
(假设每个字符3个字节)
您可以使用FLOOR( CHAR_LENGTH() / LENGTH() * @desiredNumberOfBytes )
的某种组合来返回与特定字节数相关的字符数,但这可能会导致非整数字符(因此使用FLOOR
,但也可以使用ROUND
或CEILING
。
正如您已经看到的,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)