varchar をその長さでサブストリング化する必要があります。
select
substr('abcdefg', 1, 3),
substr('가나다라마바사', 1, 3)
from dual;
これは戻ります
en ko
abc 가나다
しかし、私が必要なのは
en ko
abc 가
'abc' と '가' の長さは 3 です。
私が探している機能があることを願っています。
あなたの問題を解決する関数を作成します:
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)
何が問題なのかよくわかりませんが、マルチバイト文字に関連する長さに問題があるようです。
代わりに、文字列の長さを決定する ためにLENGTH()
使用できます。マルチバイト文字 ( CHAR_LENGTH docs )を考慮し、文字列の長さをバイト単位で返します。あなたの場合、韓国語には a but a があります(1文字あたり3バイトと仮定)CHAR_LENGTH()
CHAR_LENGTH()
LENGTH()
CHAR_LENGTH() = 7
LENGTH() = 21
の組み合わせを使用FLOOR( CHAR_LENGTH() / LENGTH() * @desiredNumberOfBytes )
して、特定のバイト数に関連する文字数を返すことができますが、これにより、整数以外の文字数になる場合があります (したがって、 または を使用FLOOR
するROUND
ことCEILING
もできます)。
すでに見てきたように、SUBSTRING()
はすでにマルチバイトセーフです。
より具体的な答えを得るには、あなたが何を達成しようとしているのかについて明確にする必要があると思います.