I found some very strange mysql behavior.
If I run the following command:
mysql> select left(concat("A", "B®"), 3);
Then the output is as expected:
+-----------------------------+
| left(concat("A", "B®"), 3) |
+-----------------------------+
| AB® |
+-----------------------------+
1 row in set (0.00 sec)
However, if I change “A” with some number (1 in this case):
mysql> select left(concat(1, "B®"), 3);
The unicode character “®” becomes corrupted:
+---------------------------+
| left(concat(1, "B®"), 3) |
+---------------------------+
| 1B? |
+---------------------------+
1 row in set (0.00 sec)
Anybody knows how to explain this strange behavior and how to avoid it?
The example above is only a reproduction, in the real life it’s a concat of numbers together with strings unknown ahead (not hard-coded strings).
Thanks a lot!
Mysql doesn’t convert integer to strings literally. It converts number into the binary representation of it, which is not the same. “if the arguments include any binary strings, the result is a binary string. A numeric argument is converted to its equivalent binary string form; if you want to avoid that, you can use an explicit type cast, as in this example:
Refer this for details.
I would also like to read from others if someone has different opinion.