我有一个MySQL数据库表来存储国家名称和货币符号 - Charset已正确设置为UTF8。

这是插入表中的示例数据

insert into country ( country_name, currency_name, currency_code, currency_symbol) values 
('UK','Pounds','GBP','£');

当我在数据库中查看时 - 磅符号看起来不错 - 但是当我从数据库中检索它并在网站上显示时 - 怪异的正方形符号在内部带有问号而不是磅符号。

在my.cnf中进行编辑 - 字符集设置为latin1-我将其更改为utf8-然后我登录为root and ran s-返回

Server characterset:    utf8
Client characterset:    utf8

校正

-- Database
SELECT default_collation_name
  FROM information_schema.schemata
 WHERE schema_name = 'swipe_prod';

THIS DOES NOT RETURN ANYTHING

-- Table
SELECT table_collation
  FROM information_schema.tables
 WHERE TABLE_NAME = 'country';

THIS RETURNS utf8_general_ci

-- Columns
SELECT collation_name
  FROM information_schema.columns
 WHERE TABLE_NAME = 'country';

THIS RETURNS 7 ROWS but all have either null or utf8_general_ci

PHP代码

<?php
$con = mysql_connect("localhost","user","123456");
mysql_select_db("swipe_db", $con);
$result = mysql_query("SELECT * FROM country where country_name='UK'");
while($row = mysql_fetch_array($result))
{
  echo $row['country_name'] . " " . $row['currency_symbol'];
}
mysql_close($con);
?>

请建议谢谢

有帮助吗?

解决方案

当您看到“内部有问号的怪异的正方形符号”时,也称为 替换字符, ,这通常是指您具有80-FF(128-255)的字节,并且该系统正在尝试将其呈现在UTF-8中。

对于UTF-8中的单字节字符,整个字节范围都是无效的,但在诸如ISO-8859-1之类的西方编码中都很常见。

当我查看您的页面并手动将编码的字符从UTF-8切换到ISO-8859-1(在Firefox中 View >> Character Encoding >> Western (ISO-8859-1))然后 英镑符号 正确显示。

那么,怎么了?很难说 - 有数十个可以犯规的地方。但很可能是在数据库级别。将表格设置为UTF8的炭集通常不够。您所有的炭是符合人物和校正都必须按顺序进行,然后才能正确地围绕系统移动。一个常见的陷阱是不正确的 连接charset, ,所以我从那里开始。

让我知道您是否需要更多指导。

编辑

要检查实际存储该值的字节,请运行此查询。

SELECT hex( currency_symbol )
  FROM country
 WHERE country_name = 'UK'

如果你看到 A3 然后您知道角色被存储为ISO-8859-1。这意味着问题发生在写入DB期间或书写之前。

如果你看到 C2A3 然后您知道角色被存储为UTF-8。这意味着问题发生在从数据库中阅读和写入浏览器之前。

编辑2

-- Database
SELECT default_collation_name
  FROM information_schema.schemata
 WHERE schema_name = 'your_db_name';

-- Table
SELECT table_collation
  FROM information_schema.tables
 WHERE TABLE_NAME = 'country';

-- Columns
SELECT collation_name
  FROM information_schema.columns
 WHERE TABLE_NAME = 'country';

其他提示

在我的两便士上碎裂。我用 UTF8_ENCODE() 从数据库中输出数据。这似乎也照顾其他角色。

尝试使用

&pound;

代替£符号,您要在哪里打印£签名,请做:

<%=replace(stringWithPoundInIt,"£","&pound;"%>

我有同样的问题。我所做的是在连接到数据库(PHP)之后立即运行:

mysql_query("SET NAMES utf8");

希望这可以帮助..

我遇到了同样的问题,并通过在MySQL数据库上运行SELECT查询之前添加以下PHP代码来解决它。

mysql_query("SET character_set_results=utf8", $link);

我自己遇到了这个问题,并在输出阶段解决了”mb_convert_encoding".

使用您的示例...

echo $row['country_name'] . " " . mb_convert_encoding($row['currency_symbol'], "UTF-8");

你可以退房 这里我不确定它是否有效,但请尝试一下,因为这很奇怪,我以前从未见过类似的东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top