mysql - 简单的 concat + left mysql 命令后,unicode 被破坏

标签 mysql unicode

我发现了一些非常奇怪的 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)

有人知道如何解释这种奇怪的行为以及如何避免它吗?

上面的示例只是一个再现,在现实生活中,它是数字与前面未知的字符串(不是硬编码字符串)的连接。

非常感谢!

最佳答案

Mysql 不会按字面意思将整数转换为字符串。它将数字转换成它的二进制表示形式,这是不一样的。 “如果参数包含任何二进制字符串,则结果是二进制字符串。数字参数将转换为其等效的二进制字符串形式;如果您想避免这种情况,可以使用显式类型转换,如下例所示:

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

引用this了解详情。

如果有人有不同意见,我也想阅读其他人的意见。

关于mysql - 简单的 concat + left mysql 命令后,unicode 被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14725172/

相关文章:

mysql - Concat 值在 MySQL 查询中(处理空值)

php - 如何比较 2 个用户在单选按钮上的输入

php - 从连接表中获取数据

c++ - 使用 MAPI 的文件附件的 Unicode 文件名

javascript - html 钻取下拉所选值未插入 MYSQL

php - 为什么 MySQL 的 UNIX_TIMESTAMP 在 MySQL 5.5 中返回奇怪的值,如 '%qd'?

C++ & boost : encode/decode UTF-8

Python 极其令人费解的正则表达式 unicode 行为

php - Web 服务 unicode 字符显示为问号

用于字体图标的 ios 动态 unicode NSString