我的数据库表如下:
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字符,为什么会这样?
答案 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 }}。