2013-07-08 1 views
0

해당 길이로 varchar를 하위 문자열로 사용해야합니다.varchar length()로 부분 문자열 필요

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

en ko 
abc 가나다 

를 반환하지만 'ABC'와 '가'의 길이가 3

희망하는 기능 거기 때문에 내가 필요한 것은

en ko 
abc 가 

입니다 내가 찾는거야.

+0

항상 영어 문자의 NR 사이 * 2 요인이 있는가 무엇이든이 언어는 인물입니까? –

+0

Bartdude // 한글 한자는 영문 3 바이트, 영문 1 바이트입니다. – Deckard

답변

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) 
1

문제가 무엇인지 알 수 없지만 멀티 바이트 문자와 관련된 길이 문제가있는 것으로 보입니다.

LENGTH() 대신 CHAR_LENGTH()을 사용하여 문자열 길이를 확인할 수 있습니다. CHAR_LENGTH()은 멀티 바이트 문자 (CHAR_LENGTH docs)를 취합니다. 여기서 LENGTH()은 문자열의 길이를 바이트 단위로 반환합니다. 귀하의 경우 한국은 CHAR_LENGTH() = 7하지만이 것 LENGTH() = 21 당신은 바이트의 특정 숫자와 관련된 문자의 수를 반환하는 FLOOR(CHAR_LENGTH()/LENGTH() * @desiredNumberOfBytes)의 조합을 사용할 수

(문자 당 3 바이트를 가정), 그러나 이것은 다음이 발생할 수 있습니다 정수가 아닌 문자 수 (따라서 FLOOR의 사용, ROUND 또는 CEILING이 사용될 수도 있음).

이미 살펴본 바와 같이 SUBSTRING()은 이미 멀티 바이트 안전합니다.

더 구체적인 답변을 얻으려면 내가 성취하고자하는 것에 대해 명확한 설명이 필요합니다.

+0

내 문제는, 난 정확히 3bytes (또는 이상)에 의해 varchar을 substring 수 없습니다. 나는'CHAR_LENGTH()'가 어떻게 작동하는지 알고 있지만 내 경우에는 그것들을 함께 작동시킬 수 없다. .. – Deckard

+0

미안하지만 아직도 나는 그 질문을 정말로 이해하지 못한다고 생각한다. 나는 당신이 요구 한 것을 볼 수 있지만 그것이 해결하려고하는 문제를 정확하게 기술하지 않고 한 가지 예를 설명하는 것처럼 느껴집니다. 정확한 조언을 제공하기가 어렵습니다. –