関数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ầ |
+-----------------------+
'SUBSTRを()'試してみてください。アカウント名にはおそらく十分です。 –
私はそれを使用しましたが、それは同じではありません。例> select substr( "Trần"、1,4); mysqlの差分で> select substrb( "Trần"、1,4)をデュアルから選択します。 "ầ"は3バイトであるため、oracleに入れてください。 –