PHP PDO mysql insert 中文问题

2015-12-16 01:23:43 +08:00
 baozijianke

因为编码问题打搅大家真是不好意思。

环境:
Windows10
Apache/2.4.18 (Win32)
Laravel 5.1
PHP/7.0.0
5.7.10-log - MySQL Community Server (GPL)
服务器字符集: UTF-8 Unicode (utf8)

我的数据库和表是 UTF8 编码,

我的代码也使用 UTF8 编码

代码使用了 Laravel 作为框架,在 Laravel 的框架中,
……\vendor\laravel\framework\src\Illuminate\Database\Connection.php
使用了这么一段代码

如图中红色圈处所示,我加了一个 var_dump()来显示即将存储的数据,打印得到的是

_
出问题的地方就在图中的那段 地址 处,此时地址为 D:\MusicBase\xxx 纯中文的歌曲 1.mp3 。
在执行完以后,数据库中出现的情况是这样子的

如果将文件名字全部改为中文, 如 D:\MusicBase\纯中文的歌曲 1.mp3 ,则变为

感觉像是字符串中 从中文开始以后全部被截断。

自己在搜索引擎中搜索之后,有人提示在执行 insert 之前先执行 “ set names utf8 ”,我照做之后没有任何改变。
我突发奇想,将该命令改为 “ set names gbk ”,结果却成功存入数据库,如图

这到底是为什么?

1724 次点击
所在节点    问与答
4 条回复
msg7086
2015-12-16 01:29:12 +08:00
检查你的输入源。
如果你 var_dump 打印出来是在 Windows 的 CMD 下,那说明数据是 GBK 的。
(和你源码的字符集是无关的。
baozijianke
2015-12-16 01:53:15 +08:00
@msg7086 终端我使用的是 Windows 下的 MINGW64 。
输入源 是使用的 Symfony 框架的 Finder 组件,获得文件和目录地址。
您提醒我了,我这样做了个实验:同样输出一段地址,分别在 MINGW64 和浏览器上执行。
在 MINGW64 上
![]( )
在浏览器上
![]( )
浏览器是默认是 UTF-8 编码,在改为 GBK 编码后也能正常显示,这样证明了确实是我的输入源本身就是 GBK 编码。

非常感谢!!!

另外,因为我是使用 Symfony 框架的 Finder 组件,输入源是 GBK 编码的原因是该框架的原因还是 Windows 本身的原因? 还是需要具体看代码才能分析?
msg7086
2015-12-16 02:00:15 +08:00
Finder 是啥?
你这个是读取本地文件的名字吗?
Windows 下都是本地编码吧, Linux 下才是 UTF-8 。
(所以如果你程序准备在 Linux 下跑的,千万别在 Windows 下调测。
baozijianke
2015-12-30 09:06:47 +08:00
@msg7086 嗯,这几天恶补了下编码和字符等知识,确认了,这就是编码的问题。诶,还是走 Linux 吧,不考虑 win 平台了。太坑了。

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

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

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

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

© 2021 V2EX