1

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

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

4

2 回答 2

6

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

mysqlCLI 中,您可以使用以下命令查看各种属性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
  • 0xA3使用 UTF-8 编码会产生字节0xC20xA3
  • 0xC2并由0xA3iso-latin-1 字形“£”表示
于 2012-06-20T12:10:27.957 回答
3

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

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

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

在支持更奇怪的货币、对货币符号的变化做出反应(是的,这种情况发生)、处理一段时间内的汇率以及将数据输出到网站以外的地方时,这肯定会让您的生活更轻松。

于 2012-06-20T12:13:40.443 回答