当进入mysql时,英镑符号显示为A£

时间:2012-06-20 11:59:53

标签: php mysql

我有一个表格可以将价格保存到数据库中,但是当用户输入一个£符号时,它显示为A£,反射重音超过A(不知道如何编写其中一个)。当我在phpmyadmin手动输入时,它不会这样做。价格领域的联盟是latin1,它是一个varchar所以我没有看到任何问题。在php的mysql查询中,价格有htmlspecialchars和mysql_real_escape_string,但我已经关闭了,问题仍然存在。

最后,不仅仅是以不同的方式显示£符号,它实际上是以不同方式将其保存到数据库中。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

这通常是由连接的字符集和字符串用户不同意引起的。例如,连接字符集可能返回UTF-8,PHP脚本可能会将字符串视为iso-latin-1,这将导致这种情况。我不确定如何在PHP中设置这些属性。

mysql CLI中,您可以使用SHOW VARIABLES

查看各种属性
mysql> show variables like '%char%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | latin1                                                  |
| character_set_connection | latin1                                                  |
| character_set_database   | latin1                                                  |
| character_set_filesystem | binary                                                  |
| character_set_results    | latin1                                                  |
| character_set_server     | latin1                                                  |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+

我会开始朝那个方向看。这里的指示是,当您期待单个字符时,您会看到多个字符。超出7位范围的任何内容都将被编码为多个UTF-8八位字节。

UTF-8详细信息

  • “£”是iso-latin-1代码点0xA3
  • 使用UTF-8进行
  • 0xA3编码会产生字节0xC20xA3
  • 0xC20xA3由iso-latin-1字形代表“££”

答案 1 :(得分:3)

如果更改应用程序的设计以将值和货币存储在单独的列中,您可能会从长远来看为自己节省很多麻烦。

value | currency
----------------
10    | GBP
16.42 | USD

然后,您可以在添加到数据库之前解析用户输入,无论是£1010GBP还是Ten Pounds Sterling,并在从数据库中检索时对其进行适当格式化。 / p>

这肯定会让你的生活变得更加轻松,支持奇怪的货币,对货币符号的变化做出反应(是的,that happens),随着时间的推移处理汇率,并将数据输出到除了以外的地方一个网站。