Aidea
V2EX  ›  PHP

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

  •  
  •   Aidea · Sep 21, 2017 · 1884 views
    This topic created in 3245 days ago, the information mentioned may be changed or developed.

    在 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 replies    2017-09-21 22:11:10 +08:00
    HMSQQbA
        1
    HMSQQbA  
       Sep 21, 2017 via Android
    v2ex 自动给中英文间加空格
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1019 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 90ms · UTC 18:49 · PVG 02:49 · LAX 11:49 · JFK 14:49
    ♥ Do have faith in what you're doing.