MySQL-utf8字符无法正确显示

时间:2020-01-14 17:50:26

标签: mysql utf-8

我的数据库表如下:

CREATE TABLE `tbl_jobs` (
   `job_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
   `job_title` VARCHAR(100) NOT NULL,
   `job_salary` VARCHAR(150) NULL DEFAULT NULL,
   `job_desc` TEXT NOT NULL,
  PRIMARY KEY (`job_id`),
COLLATE='utf8_general_ci'
ENGINE=InnoDB

在其中一条记录中,我的薪水存储为€30,000 plus excellent benefits,因此在网页中,薪水应显示为€30,000 plus excellent benefits。如您所见,€是有效的utf8字符。

我的数据库连接如下:

`mysql:host=myhost;dbname=mydatabase;charset=utf8`

我的网页顶部有以下元标记:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

但是在网页上,它仍呈现为€30,000 plus excellent benefits。如果按照以下方式将连接字符集更改为latin1,它将正确呈现。

`mysql:host=myhost;dbname=mydatabase;charset=latin1`

考虑到它是utf8字符,为什么会这样?

3 个答案:

答案 0 :(得分:0)

我猜测信息以前是使用latin1字符集保存的,因此当将其打印为utf8时,会得到错误的数据。

如果数据是使用utf8保存的,那么您也会在表上看到正确的数据。

答案 1 :(得分:0)

在latin1中,用0xE2字节表示,逗号(,)表示为0x2C,¬表示为0xAC

在Unicode中,€是U+20AC,它以0xE2 0x82 0xAC的形式编码为UTF-8。

我认为正在发生的事情是,当您的连接为latin1时,数据库访问将向浏览器发送0xE2 0x82 0xAC,该浏览器期望使用UTF-8,并将其呈现为欧元符号€。但是,当您告诉数据库使用UTF-8进行连接时,它将表示为Unicode字符U + 00E2(â)U + 0082(BREAK PERMITTED HERE)U + 00AC(¬),并将其发送给以UTF-8编码的浏览器,它显示为“ â,¬”。

解决方案是将欧元符号(€)存储在数据库中,将连接设置为UTF-8,它将在网页上显示为欧元符号。

答案 2 :(得分:0)

您具有“ Mojibake”或“双重编码”。参见Trouble with UTF-8 characters; what I see is not what I stored

执行SELECT col, HEX(col) FROM ...以查看存储的内容。听起来客户端已经用UTF-8编码了。特别是十六进制为E282AC的3个字节。但是连接参数表明客户端正在使用latin1。因此,当这2个字节发送到服务器时,它们已从被视为latin1(E2 82 AC)的€转换为utf8等效形式,仍为€,但现在编码为{{1 }}。