2017-06-20 146 views
0

我正在從oracle數據庫轉換爲mysql數據庫。在oracle數據庫中,使用函數substrb將返回一部分字符串,從指定的字節位置開始,並指定字節長度。如何將函數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)from dual;在oracle中因爲「ầ」是3個字節。 –

回答

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數據庫中,當我執行query> select substrb('Trần',1,4)from dual;它返回結果'Tr',因爲oralce定義'ầ'是3個字節,'是2個字節。如果你想得到'Trầ'的值,你必須查詢>選擇substrb('Trần',1,5)from dual;請修復該功能幫助我。 –

+0

@KennyTran再看看它。這與Oracle和MySQL中的字符集差異有關。它與代碼無關。在我之前的評論中,我還談到了整理(如果你已經閱讀過),這是我的錯誤,我混淆了這兩個術語。無論如何,看看你是否可以用另一個字符集來解決這個問題。有關此主題的更多信息,請參閱此處(https://dev.mysql.com/doc/refman/5.7/en/charset-mysql.html)。 – fancyPants