我需要按其长度对 varchar 进行子串化。
select
substr('abcdefg', 1, 3),
substr('가나다라마바사', 1, 3)
from dual;
这返回
en ko
abc 가나다
但我需要的是
en ko
abc 가
因为'abc'和'가'的长度是3。
希望有我正在寻找的功能。
我不确定我是否理解问题所在,但您似乎遇到了与多字节字符相关的长度问题。
而不是LENGTH()
你可以CHAR_LENGTH()
用来确定字符串长度。 CHAR_LENGTH()
考虑到多字节字符(CHAR_LENGTH 文档),其中 asLENGTH()
以字节为单位返回字符串的长度。在您的情况下,韩语将有 a CHAR_LENGTH() = 7
but a LENGTH() = 21
(假设每个字符 3 个字节)
您可以使用某种组合FLOOR( CHAR_LENGTH() / LENGTH() * @desiredNumberOfBytes )
来返回与特定字节数相关的字符数,但这可能会导致非整数字符数(因此使用FLOOR
, 尽管ROUND
或CEILING
也可以使用)。
正如您已经看到的,SUBSTRING()
它已经是多字节安全的。
恐怕要获得更具体的答案,我需要澄清一下您要达到的目标。
我会创建一个函数来解决您的问题:
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)