我正在从oracle数据库转换为mysql数据库。在oracle数据库中,使用函数substrb
返回字符串的一部分,从指定的字节位置开始,以及指定的字节数。
实施例
select substrb(account_name,1,2) from account;
但我在mysql中找不到substrb
每个人都可以帮我转换它或在mysql中编写函数来转换它
非常感谢。
答案 0 :(得分:0)
您可以使用函数bit_length()
返回给定字符串中的位数。将结果除以8,你有一个字节。
这里有一些你可以使用的代码,但你可能需要构建一些更多的检查,例如字符串长度等,以使其能够用于任何给定的字符串或无效参数,或者向后读取字符串参数等。
DROP FUNCTION IF EXISTS substrb;
DELIMITER $$
CREATE FUNCTION substrb(p_string varchar(255), p_start tinyint, p_len tinyint)
RETURNS varchar(255)
DETERMINISTIC
BEGIN
DECLARE v_pos_start tinyint;
DECLARE v_len tinyint;
DECLARE v_bytesRead tinyint;
SET v_pos_start = 0;
SET v_bytesRead = 0;
IF (p_start < 1) THEN
RETURN NULL;
ELSEIF (p_start = 1) THEN
SET v_pos_start := 1;
ELSE #p_start > 1
WHILE (v_bytesRead < p_start)
DO
SET v_bytesRead := v_bytesRead + (BIT_LENGTH(SUBSTR(p_string, 1 + v_pos_start, 1)) / 8);
SET v_pos_start := v_pos_start + 1;
END WHILE;
END IF;
SET v_len = 0;
SET v_bytesRead = 0;
IF (p_len < 1) THEN
RETURN NULL;
ELSEIF (p_len = 1) THEN
SET v_len := 1;
ELSE #p_start > 1
WHILE (v_bytesRead < p_len)
DO
SET v_bytesRead := v_bytesRead + (BIT_LENGTH(SUBSTR(p_string, v_pos_start + v_len, 1)) / 8);
SET v_len := v_len + 1;
END WHILE;
END IF;
RETURN SUBSTR(p_string, v_pos_start, v_len);
END $$
DELIMITER ;
使用示例:
mysql(playground) > select substrb('a x test', 1, 7);
+---------------------------+
| substrb('a x test', 1, 7) |
+---------------------------+
| a x tes |
+---------------------------+
1 row in set (0.00 sec)
mysql(playground) > select substrb('a ü test', 1, 7);
+----------------------------+
| substrb('a ü test', 1, 7) |
+----------------------------+
| a ü te |
+----------------------------+
1 row in set (0.00 sec)
mysql(playground) > select bit_length('ü');
+------------------+
| bit_length('ü') |
+------------------+
| 16 |
+------------------+
1 row in set (0.00 sec)
ü
是2个字节,因此结果是一个字符更短。
或者,通过评论中的示例:
mysql(playground) > select substr("Trần",1,4);
+----------------------+
| substr("Trần",1,4) |
+----------------------+
| Trần |
+----------------------+
1 row in set (0.00 sec)
mysql(playground) > select substrb("Trần",1,4);
+-----------------------+
| substrb("Trần",1,4) |
+-----------------------+
| Trầ |
+-----------------------+