伪“latin1与utf-8乱码问题”


问题描述:

        数据库某字段建表语句:

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”语句




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值