代码之家  ›  专栏  ›  技术社区  ›  jkndrkn

php 5.2.10和mysql 5.0.81中的utf-8字符已损坏

  •  2
  • jkndrkn  · 技术社区  · 14 年前

    我们有一个托管在本地开发服务器和实时站点上的应用程序。我们正在经历utf-8的腐败问题,并正在寻找解决办法。

    该系统是运行使用symfony 1.0推进。

    在我们的开发服务器上,我们运行php 5.2.0和mysql 5.0.32。我们在那里没有遇到损坏的utf-8字符。

    在我们的live站点上,php 5.2.10和mysql 5.0.81正在运行。在服务器上,某些字符,如 奥特 γ 一旦它们存储在数据库中,就会被损坏。损坏的字符显示为问号或与相邻问号的原始字符的近似值。

    腐败的例子:

    Uncorrupted: 腐败:_?

    不腐败:∑ 腐败:?

    我们目前正在开发服务器和实时服务器上使用以下技术:

    1. 在执行任何其他查询之前执行以下查询:

      SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'
      SET CHARSET 'utf8'
      
    2. 设置 <meta> 内容类型值到:

      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      
    3. 在.htaccess文件中添加以下内容:

      AddDefaultCharset utf-8
      
    4. 使用 mb_* (多字节)必要时使用php函数。

    5. 请确保将数据库列设置为使用utf8_unicode_ci排序规则。

      这些技术对于我们的开发站点来说已经足够了,但是不能在现场工作。

    在现场我也试着添加 mysql_set_encoding('ut8', $mysql_connection) 但这也无济于事。我发现了一些新版本的php和mysql错误处理utf-8字符编码的证据。

    5 回复  |  直到 13 年前
        1
  •  3
  •   user8599    14 年前

    举一个简单的例子-提交一个带有∑字符的表单,并从浏览器到数据库的路径中分离出它被破坏的位置。将bin2hex($str)的值打印到php应用程序的日志中,在从浏览器接收到请求后尽快打印,最后一件事是在将其交给数据库之前,以及您怀疑可能是问题区域的任何其他地方-for∑ cea3 . 在数据库中,对保存的数据运行charset(col)、hex(col)-如果一切正常,应该打印出[“utf8”、“cea3”](假设表是utf8)。

    你越清楚 怎样 字符已损坏-是否显示为空白?作为莫吉巴克?作为空的“豆腐”盒?字符串是否在问题字符处被截断?预期和观察到的字节表示是什么?-你会得到更多的线索知道是什么引起的。

        2
  •  1
  •   prodigitalson    14 年前

    请注意,如果您使用的是条令或推进 mysql_set_encoding() 不会有任何影响,因为这两个orms都是基于pdo的(propel<1.3是基于creole/mysqli的)。

        3
  •  1
  •   jkndrkn    14 年前

    我们经验丰富的系统管理员发现了一个修补程序:

    alter database DB_NAME character set utf8;

    这完全解决了我们的问题。

        4
  •  0
  •   Alix Axel    14 年前

    这些字符只有存储在数据库中时才会损坏吗?php呢?

    尝试添加 accept-charset="UTF-8" attribute 你的形状元素。


    同时,确保 .php 文件是utf-8编码的,没有bom。

        5
  •  0
  •   animuson Hemanshu    13 年前

    我也遇到过同样的问题,但它不是mysql,因为docine负责所有事情,从db排序到utf-8中的表和连接。

    我发现 substr() 会给变音带来麻烦所以我改成了 mb_substr() , mb_strlen() 用户输入数据等。不要忘记ini设置,否则它将不起作用:

    ini_set('mbstring.internal_encoding','UTF-8');
    

    mbstring.internal_encoding = UTF-8; //in php.ini