我发现了一些非常奇怪的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)
有谁知道如何解释这种奇怪的行为以及如何避免它?
上面的例子只是一个复制品,在现实生活中它是一个数字的连续点以及未知的字符串(不是硬编码的字符串)。
非常感谢!
答案 0 :(得分:1)
Mysql不会从字面上将整数转换为字符串。它将数字转换为它的二进制表示,这是不一样的。 “如果参数包含任何二进制字符串,则结果为二进制字符串。数字参数将转换为其等效的二进制字符串形式;如果要避免这种情况,可以使用显式类型转换,如下例所示:
SELECT CONCAT(CAST(int_col AS CHAR), char_col);
有关详细信息,请参阅this。
如果有人有不同意见,我也想读别人。