0

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

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

这返回

en  ko
abc 가나다

但我需要的是

en  ko
abc 가

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

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

4

2 回答 2

1

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

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

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

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

恐怕要获得更具体的答案,我需要澄清一下您要达到的目标。

于 2013-07-08T10:08:47.520 回答
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)
于 2013-07-08T10:58:17.277 回答