我正在使用mysql表存储货币符号unicode但是当我将它返回到我的Android应用程序时,它显示相同的unicode字符串( \ u20B9 )而不是货币符号(₹)。
早些时候我使用硬编码像dto.setCurrencyCode("\u20B9")
这样它工作正常但是如果我从mysql表中获取它并在dto中设置它就无法工作。
mysql表charset就像 -
+--------------+--------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+--------------+--------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
| id | bigint(20) | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | |
| apiUrl | varchar(255) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| countryCode | varchar(255) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| currencyCode | varchar(255) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| locale | varchar(255) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
| mcc | int(11) | NULL | NO | MUL | NULL | | select,insert,update,references | |
| msisdnLength | int(11) | NULL | NO | | NULL | | select,insert,update,references | |
+--------------+--------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+
和表条目就像 -
mysql> select * from MccDetails;
+----+-------------------------------------+-------------+--------------+--------+-----+--------------+
| id | apiUrl | countryCode | currencyCode | locale | mcc | msisdnLength |
+----+-------------------------------------+-------------+--------------+--------+-----+--------------+
| 1 | https://localhost:8080/api/ | +91 | \u20B9 | en | 404 | 10 |
| 2 | https://localhost:8080/api/ | +91 | \u20B9 | en | 405 | 10 |
+----+-------------------------------------+-------------+--------------+--------+-----+--------------+
这是我的连接字符串 -
jdbc:mysql://127.0.0.1:3306/dbname?autoReconnect=true&useUnicode=true&connectionCollation=utf8_general_ci&characterSetResults=utf8
请让我知道currencyCode
列的数据类型应该是什么,以及如何在表中存储unicode值(\ u20B9)或在客户端服务器体系结构中处理货币符号的最佳方法。
答案 0 :(得分:1)
显然存储为String而不是字符。
您需要做的是在连接字符串上启用正确的编码
var rootnode = new joint.shapes.basic.Circle({
position: { x: 20, y: 220 },
size: { width: 60, height: 30 },
attrs: {
text: { text: 'parent' },
circle: { fill: 'yellow', hasChildren:false }
},
name: 'parent'
});
graph.addCell(rootnode);
具有类似₹的字符的字符串将在您执行此操作时正确存储到数据库。您不必再使用\ u20B9代码
答案 1 :(得分:0)
MySQL(根据撰写本文时)似乎不支持基于代码点的Unicode字符。但是他们似乎按照他们的日程安排; see here
我想到以下事情来解决这个问题:
第一个解决方案
在这里,我假设您使用的是bash shell中的Linux UTF-8控制台。然后你可以先用bash
打印之后的角色echo $'\u20B9';
如果您的系统配置正确,这将打印出所需的字符到控制台。然后只需使用鼠标复制字符,并在MySQL客户端中将粘贴到适当位置的SQL命令中。即使您通过SSH登录,这也应该有效。
这个解决方案可能看起来不专业,但如果你只有一些这样的符号,那么它是务实和容易的。
请注意,这只有在您将 MySQL客户端配置为使用与相关列相同的编码时才有效。否则,一些垃圾字符将被写入相关的行/列中。
第二个解决方案
虽然MySQL还不允许根据代码点输入字符,但它允许根据编码输入字符。
从您的示例中,您在数据库/表/列中使用UTF-8编码。因此,对于这个解决方案,我们首先必须掌握你所追求的角色的UTF-8编码。
同样,如果您使用的是Linux上的UTF-8控制台,这很容易。在bash中,做
echo $'\u20B9' | hexdump;
这将打印出类似
的内容0000000 82e2 0ab9
0000004
我们所追求的是82e2 0ab9
部分。假设我们在一个小端机器上(就像我们在x86 / x64上那样),我们必须反转每个块中的字节并得到e282 b90a
。
但我们还没有完成:echo
命令在其输出的末尾添加了换行符,该换行符已成为hexdump的一部分;因此,最后有一个LF char(0a
)。当然,换行符不是你角色的一部分,所以我们必须删除它。完成后,我们终于以小端符号获得了你角色的UTF-8编码:
0xe282b9
现在,在MySQL客户端中,执行以下操作:
INSERT INTO ... (..., currencyCode, ...)
VALUES (..., 0xe282b9, ...)
是的,你真的可以用这种方式将UTF-8编码的字符插入MySQL数据中!
如果你在Windows上,你可能会做类似的事情,但我没有测试,也不知道。如果您不能使用合理的UTF-8控制台/ shell,那么您可以使用在线工具like this one获取Unicode字符(代码点)的UTF-8编码。
与第一种解决方案一样,只有在您不需要经常这样做的情况下,这种解决方案才适用。
第三种解决方案
如果您需要定期插入Unicode字符或字符串,您可以自动执行解决方案1或解决方案2,或者您可以使用您选择的编程语言编写一个小脚本或程序(这甚至可能是一个bash脚本)。我在这里没有提供示例,因为我不知道您喜欢哪种编程语言,并且因为您的整个问题给人的印象是您正在寻找仅使用MySQL客户端的解决方案。