我有一个表格可以将价格保存到数据库中,但是当用户输入一个£符号时,它显示为A£,反射重音超过A(不知道如何编写其中一个)。当我在phpmyadmin手动输入时,它不会这样做。价格领域的联盟是latin1,它是一个varchar所以我没有看到任何问题。在php的mysql查询中,价格有htmlspecialchars和mysql_real_escape_string,但我已经关闭了,问题仍然存在。
最后,不仅仅是以不同的方式显示£符号,它实际上是以不同方式将其保存到数据库中。我该如何解决这个问题?
答案 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详细信息
0xA3
0xA3
编码会产生字节0xC2
,0xA3
0xC2
和0xA3
由iso-latin-1字形代表“££”答案 1 :(得分:3)
如果更改应用程序的设计以将值和货币存储在单独的列中,您可能会从长远来看为自己节省很多麻烦。
value | currency
----------------
10 | GBP
16.42 | USD
然后,您可以在添加到数据库之前解析用户输入,无论是£10
,10GBP
还是Ten Pounds Sterling
,并在从数据库中检索时对其进行适当格式化。 / p>
这肯定会让你的生活变得更加轻松,支持奇怪的货币,对货币符号的变化做出反应(是的,that happens),随着时间的推移处理汇率,并将数据输出到除了以外的地方一个网站。