PHP往MYSQL表里写入汉字时被诡异地明文储存为十进制utf8编码

2013-06-29 23:08:02 +08:00
 gengyanda
最近在用php下的mysqli做一个简单的名单程序。

建立了一个表,其中有个name列,类型为varchar(20)。结果三个汉字的人名。只有前两个字能正常显示,第三个字乱码。

命令行下select,发现汉字全被用utf8十进制明文储存起来了。

于是乎,“你好”被储存成了“你好”,共十六个字符。经查证,&#后面一串数字是utf8编码。这真是太奇葩了。但是在php里query后得到结果再echo,照样echo出“你好”。

网上查了半天都没说这是啥情况。有知道怎么解决的吗?

另外,试过了mysqli_set_charset('utf8'),没有效果。

目前没有在别的电脑上测试,我的电脑是ubuntu,mysql 5.5.31-0ubuntu0.12.04.2
3740 次点击
所在节点    MySQL
7 条回复
gengyanda
2013-06-29 23:27:48 +08:00
> 于是乎,“你好”被储存成了“你好”

应该是被储存成了“&# 20320; &# 22909”,中间的空格请无视掉。因为刚刚直接打上去这串内容被v2ex直接转换成汉字了……
explon
2013-06-29 23:28:49 +08:00
表的 charset 设置错了吧
gengyanda
2013-06-29 23:33:45 +08:00
@explon 我总觉得这是php写入时的问题,因为读取的时候能正常读取。会不会是php先把汉字转换成了明文的utf8码,然后储存的?搞不清也不知道怎么办
mopvhs
2013-06-30 09:02:04 +08:00
header("Content-type: text/html; charset=utf-8");
如果页面没有设置编码,也会出现这种情况。
sNullp
2013-06-30 09:09:23 +08:00
mysql表的charset(不是通讯的charset)没设置好,使用了最原始的字节方式直接存储。
gengyanda
2013-06-30 09:43:03 +08:00
找到问题所在了。我是用表单提交的汉字。然而我发现表单传到服务器的时候,提交上来的就已经不是汉字而是utf8码了。所以我在储存的时候自然就把码储存进去了。这不是mysql的问题,是表单提交时编码的问题。
gengyanda
2013-06-30 09:44:56 +08:00
@mopvhs 加上了这个就好了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/74148

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX