【MySQL解説】INSERT()関数で挿入位置が範囲外の場合、どうなる?
MySQLのINSERT()関数は、指定した挿入位置が有効な範囲外である場合、文字列の挿入を実行せず、元の文字列をそのまま返します。
挿入位置が範囲外になる3つのケース
INSERT()関数の第2引数(挿入位置)が範囲外とみなされるのは、主に以下の場合です。
- 位置に負の値を指定した場合
- 位置に0(ゼロ)を指定した場合
- 元の文字列の文字数+2以上の位置を指定した場合
それでは、具体的な例を使って各ケースの動作を確認していきましょう。
例1:挿入位置に負の値を指定した場合
次のクエリでは、挿入位置として-1という負の値を指定しているため範囲外となり、挿入は行われません。結果として元の文字列「Virat」がそのまま返されます。
mysql> Select INSERT('Virat', -1,5,'Kohli');
+-------------------------------+
| INSERT('Virat', -1,5,'Kohli') |
+-------------------------------+
| Virat |
+-------------------------------+
1 row in set (0.00 sec)例2:挿入位置に0(ゼロ)を指定した場合
MySQLでは文字列の位置は1から始まるため、0を指定することはできません。次のように位置に0を指定しても、挿入は実行されず元の文字列がそのまま返ります。
mysql> Select INSERT('Virat', 0,5,'Kohli');
+------------------------------+
| INSERT('Virat', 0,5,'Kohli') |
+------------------------------+
| Virat |
+------------------------------+
1 row in set (0.00 sec)例3:挿入位置が文字数を大きく超えている場合
元の文字列「Virat」は5文字ですが、ここでは挿入位置として7を指定しています。この関数で有効な最大位置は「文字数+1」であるため、これを2以上超える位置を指定すると範囲外となり、挿入は行われません。
mysql> Select INSERT('Virat', 7,5,'Kohli');
+------------------------------+
| INSERT('Virat', 7,5,'Kohli') |
+------------------------------+
| Virat |
+------------------------------+
1 row in set (0.00 sec)まとめ
INSERT()関数で意図どおりに文字を挿入するには、挿入位置として1以上、かつ元の文字数+1以下の値を指定する必要があります。範囲外の位置を指定してもエラーにはなりませんが、何も処理されず元の文字列がそのまま返される点に注意しましょう。
-
MySQLのDECIMAL(x,0)で扱える数値の範囲はどのくらい?
MySQLでは、DECIMAL型はINTEGER型やBIGINT型よりも大きな数値を扱うことができます。BIGINTの場合、最大で18446744073709551615まで格納できますが、DECIMALではDECIMAL(65,0)を指定することで、65桁すべてが「9」の巨大な数値を保存することが可能です。DECIMAL(x,0)に必要なストレージ容量DECIMALは数値をバイト単位で格納しており、必要なストレージ容量は次の計算式で求められます。StorageRequirementInBytes = (x/9) + remaining; WHERE remaining = round_up(
-
MySQLでCHAR()関数の逆の処理を行う方法|ASCII()とORD()の違いを解説
MySQLにおいて、CHAR()関数の逆の働きをするのは ASCII() 関数と ORD() 関数です。CHAR() は数値(文字コード)を文字に変換する関数ですが、ASCII() は引数の文字列の左端の文字に対応する数値(ASCIIコード)を返し、ORD() は左端の文字の文字コードを返します。 ASCII()とORD()の違い どちらも文字から数値への変換を行う点は共通していますが、以下のような違いがあります。 ASCII():シングルバイト文字専用。マルチバイト文字を渡すと警告が出て64を返します。 ORD():マルチバイト文字にも対応しており、最初のバイトの値に基づいて計算された文字