0

非常に奇妙な mysql の動作を見つけました。

次のコマンドを実行すると:

mysql> select left(concat("A", "B®"), 3);

次に、出力は期待どおりです。

+-----------------------------+
| left(concat("A", "B®"), 3)  |
+-----------------------------+
| AB®                         |
+-----------------------------+
1 row in set (0.00 sec)

ただし、「A」を数字 (この場合は 1) に変更すると、次のようになります。

mysql> select left(concat(1, "B®"), 3);

Unicode 文字 "®" が壊れます:

+---------------------------+
| left(concat(1, "B®"), 3)  |
+---------------------------+
| 1B?                        |
+---------------------------+
1 row in set (0.00 sec)

この奇妙な動作を説明する方法とそれを回避する方法を知っている人はいますか?

上記の例は単なる再現にすぎません。実際には、数値と未知の文字列 (ハードコードされた文字列ではありません) を組み合わせたものです。

どうもありがとう!

4

1 に答える 1

1

Mysql は整数を文字通り文字列に変換しません。数値をそのバイナリ表現に変換しますが、これは同じではありません。「引数にバイナリ文字列が含まれている場合、結果はバイナリ文字列になります。数値引数は、同等のバイナリ文字列形式に変換されます。それを避けたい場合は、次の例のように、明示的な型キャストを使用できます。

SELECT CONCAT(CAST(int_col AS CHAR), char_col);

詳しくはこちらをご覧ください。

また、違う意見の方がいたら読んでみたいです。

于 2013-02-06T09:12:51.647 に答える