问题描述:
数据库某字段建表语句:
name varchar(20) not null default '',
插入数据时name=‘你是谁的谁谁是谁’,取出来显示乱码,使用json_encode()之后,改字段值为NULL。
背景介绍:
数据库使用latin1编码,代码文件使用utf-8编码,页面显示使用utf-8。(至于为什么数据库不用utf-8,而是用latin1编码,这个狗血的规定我曾问过领导,领导说latin1存进去的是什么,读出来的就是什么。反正这个解释我当时没明白,至今也没明白。但后来出了问题又怀疑是这个编码不一致搞的鬼,以致在这一块费了周日下午半天时间。吐槽结束)。
问题原因:
如果您是高手,可能已经发现问题了,‘你是谁的谁谁是谁’该字符窜有8个汉字,utf-8编码一个汉字占3个字节,这样该字符串实际长度24,而数据库中name字段制定了最长20字节,超长了。。数据库存进去进行了截短,读出来最后一个字编码不全,所以var_dump出来是乱码,json_encode()函数不正常工作,产生结果为null。从表面上看是latin1与utf-8编码的不一致问题,但问实质是字段长度超过了数据库的限制,所以在标题上加了个“伪”字。领导说的latin1存进去是什么就是什么,这句话还真没错。
总结:
latin1的数据库与utf-8的值不需要进行转换。但为保险起见,在数据库连接之后,执行一次 “SET NAMES latin1”语句