0

我发现了一些非常奇怪的mysql行为。

如果我运行以下命令:

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

然后输出如预期:

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

但是,如果我用某个数字(在这种情况下为 1)更改“A”:

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 回答