MySQL-utf8字符未正确显示

MySQL-utf8字符未正确显示,mysql,utf-8,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_gen

我的数据库表如下所示:

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
`mysql:host=myhost;dbname=mydatabase;charset=utf8`
在其中一个记录中,我将工资存储为
–30000欧元外加卓越福利
,因此在网页中,它应显示为
–30000欧元外加卓越福利
。如您所见,
是一个有效的utf8字符

我的数据库连接如下:

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
`mysql:host=myhost;dbname=mydatabase;charset=utf8`
我在我的网页的标题部分有以下元标记:

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

考虑到它是utf8字符,为什么会出现这种情况?

我猜信息以前是使用拉丁字符集保存的,所以当打印它时,呈现为utf8,您会得到不正确的数据


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

在拉丁文1中,–由
0xE2
字节表示,逗号(,)表示为
0x2C
,,,,,表示为
0xAC

在Unicode中,欧元是
U+20AC
,它以
0xE2 0x82 0xAC
的形式编码到UTF-8中

我认为发生的情况是,当您的连接是拉丁1时,数据库访问会将0xE2 0x82 0xAC发送到期望UTF-8的浏览器,并将其呈现为欧元符号€。但是,当您告诉数据库使用UTF-8进行连接时,它将其表示为unicode字符U+00E2(–U+0082(此处允许中断)U+00AC(,),并将其发送到UTF-8编码的浏览器,该浏览器显示为“
,,,

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

您有“Mojibake”或“double encoding”。看


从…
中选择列、十六进制(列)以查看存储的内容。这听起来像是客户机用UTF-8编码了
。特别是,其十六进制为E282AC的3个字节。但是连接参数显示客户端使用的是latin1。因此,当这2个字节被发送到服务器时,它们被从
e282 AC
转换为utf8等价物,仍然是
,但现在编码为
C3A2 E2809A C2AC
,并且不是编码专家,是不是
?如果是utf8,它将保存为数据库中的什么。数据库排序规则是
utf8\u general\u ci
,那么为什么它最终会变成拉丁1呢?我的意思是,存储在UTF-8中的正是这个。没有翻译。当你试着把它读成拉丁文1时,它会被翻译成欧元符号。如果您使用UTF-8保存相同的数据,并输入欧元符号,那么在读取时,不会进行任何转换,您会打印欧元符号。在html表单中,如果用户输入
,,,
,并且数据库连接设置为utf8,那么表和列字符集设置为utf8,为什么仍将其保存为
,​
?重读你写的内容,看看它是否对你有意义。您输入了
,,
,它存储了
,,
。它照你说的做了。它按照您配置连接的方式将
,,,
解释为UTF-8,并存储您发送的内容。对不起,我不是编码专家。如果用户以拉丁文1格式输入了Euro符号,那么如果连接和表/列字符集都设置为utf8,为什么数据库不将其转换为utf-8?我想接下来的问题是,在提交表单时如何防止用户提交拉丁文1字符
,,,,
?无法在表单“as latin1”中输入字符串。表单将以表单使用的任何编码解释输入,在现代将是UTF-8。