V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Aidea
V2EX  ›  PHP

PHP +MySQL 无法存储以汉字开头的文件名

  •  
  •   Aidea · 2017-09-21 17:59:45 +08:00 · 1495 次点击
    这是一个创建于 2647 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 PHP 中使用

    mb_detect_encoding($name, array('ASCII','GB2312','GBK','UTF-8'))

    输出文件名的编码,出现了三种结果:UTF-8CP936EUC-CN

    比如 “简体.zip ” 是 “ UTF-8 ”,“繁体.zip ” 是 “ CP936 ”,“年纪.zip ” 是 “ EUC-CN ”

    打开数据库时指定编码:

    mysql_query("set names 'utf8'")

    截取文件名并指定编码:

    mb_substr(basename($name),0,-4,'utf-8')

    然后 insert 存储到数据库中,显示为空,就是什么都没有

    然而

    将文件名改为 “ a 简体.zip ”,“简体 1 繁体.zip ”,“ 年纪.zip ”,输出文件名的编码得到的结果和之前一致

    存入数据库后分别为 a 简体,1 繁体, 年纪,除了前面的中文被截断,没有任何乱码现象

    也就是说,MySQL 在存储文件名时如果以中文名开头则自动截断,直到遇到字母或数字为止


    另附 MySQL 编码 show variables like "%char%" 信息

    character_set_client			utf8mb4	
    character_set_connection		utf8mb4	
    character_set_database			utf8mb4	
    character_set_filesystem		binary	
    character_set_results			utf8mb4	
    character_set_server			latin1	
    character_set_system			utf8

    因为刚开始接触 PHP 和 MySQL,遇到问题都是谷歌百度,这个问题浪费了差不多一天的时间

    而就在写完这篇主题即将发布时,自己做了最后的尝试,竟然给找到了原因,但是也不想就这么删了。。。

    basename() 你大爷的

    1 条回复    2017-09-21 22:11:10 +08:00
    HMSQQbA
        1
    HMSQQbA  
       2017-09-21 22:11:10 +08:00 via Android
    v2ex 自动给中英文间加空格
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2785 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:43 · PVG 17:43 · LAX 01:43 · JFK 04:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.