2017-06-20 17 views
0

Oracleデータベースからmysqlデータベースに変換しています。関数substrbを使用するOracleデータベースでは、指定されたバイト位置から始まり、指定されたバイト数の長い文字列の一部を戻します。関数substrbをOracleからmysqlに変換する方法

select substrb(account_name,1,2) from account; 

しかし、私は、MySQLでsubstrbを見つけることができません。
誰もが私にそれを変換するか、それを変換するためにMySQLの関数を書くのを助けることができます。
ありがとうございました。

+0

'SUBSTRを()'試してみてください。アカウント名にはおそらく十分です。 –

+0

私はそれを使用しましたが、それは同じではありません。例> select substr( "Trần"、1,4); mysqlの差分で> select substrb( "Trần"、1,4)をデュアルから選択します。 "ầ"は3バイトであるため、oracleに入れてください。 –

答えて

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ầ     | 
+-----------------------+ 
+0

ありがとうございました。しかし、この関数には問題があります。Oracleデータベースでは、クエリを実行するときにsubstrb( 'Trần'、1,4)をdualから選択します。結果は 'Tr'を返します。なぜなら、口頭で 'ă'が3バイト、 'â'が2バイトと定義されているからです。値 'Trầ'を取得したい場合、二重からsubstrb( 'Trần'、1,5)を選択する必要があります。機能を改善してください。 –

+0

@KennyTranそれをもう一度見ていた。これは、OracleとMySQLの文字セットの違いに関連しています。それはコードとは関係ありません。私の前のコメントでは、私の側で間違いだった照合(あなたがそれを読んでいれば)についても話しましたが、私はこれらの2つの用語を混乱させました。とにかく、これを別の文字セットで修正できるかどうかを確認してください。このトピックの詳細については、[こちら](https://dev.mysql.com/doc/refman/5.7/en/charset-mysql.html)を参照してください。 – fancyPants

関連する問題