如何在mysql表中保存货币符号unicode

时间:2017-09-29 06:01:25

标签: java mysql unicode currency

我正在使用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&useUni‌​code=true&connection‌​Collation=utf8_gener‌​al_ci&characterSetRe‌​sults=utf8

请让我知道currencyCode列的数据类型应该是什么,以及如何在表中存储unicode值(\ u20B9)或在客户端服务器体系结构中处理货币符号的最佳方法。

2 个答案:

答案 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客户端的解决方案。