当前位置:  开发笔记 > 编程语言 > 正文

使用国际字符串的PHP和MySQL的最佳实践

如何解决《使用国际字符串的PHP和MySQL的最佳实践》经验,为你挑选了2个好方法。

经常出现这样的字符,如é被转化为é,即使对于MySQL数据库,表和字段排序规则设置为utf8_general_ci.页面的Content-Type中的编码也设置为UTF8.

我知道utf8_encode/decode,但我不太清楚在哪里以及如何使用它.

我已经阅读了" 绝对最低限度的每个软件开发人员,绝对必须知道关于Unicode和字符集(没有借口!) "的文章,但我需要一些MySQL/PHP特定的指针.

问题:如何确保用户输入的包含国际字符的数据不会被破坏?



1> Stefan Gehri..:

在第一眼看http://www.nicknettleton.com/zine/php/php-utf-8-cheatsheet时,我认为缺少一件重要的事情(也许我忽略了这一点).根据您的MySQL安装和/或配置,您必须设置连接编码,以便MySQL知道您在客户端期望的编码(意味着MySQL连接的客户端,应该是PHP脚本).您可以通过手动发出一个来完成此操作

SET NAMES utf8

在发送到MySQL服务器的任何其他查询之前进行查询.

如果您在PHP端使用PDO,则可以设置连接以通过使用在每个(重新)连接上自动发出此查询

$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");

初始化数据库连接时.


对于刚读这篇文章的人(截至2010年3月),现在可以在http://developer.loftdigital.com/blog/php-utf-8-cheatsheet找到所引用的文章.

2> troelskn..:

整理和字符集不是一回事.你的校对需要匹配字符集,所以如果你的字符集是utf-8,那么整理也是如此.选择错误的排序规则不会破坏您的数据 - 只是错误地进行字符串比较/排序.

也就是说,有几个地方,你可以在PHP中设置字符集设置.如果可能的话,我建议你在整个过程中使用utf-8.需要charset指定的位置是:

数据库.这可以在数据库,表和字段级别上设置,甚至可以在每个查询级别上设置.

PHP和数据库之间的连接.

HTTP输出; 确保HTTP标头Content-Type指定utf-8.您可以在PHP和Apache中设置默认值,也可以使用PHP的header函数.

HTTP输入.通常,表单将在提供页面的同一个字符集中提交,但为了确保,您应该指定该accept-charset属性.还要确保URL是utf-8编码的,或者避免在url(和GET参数)中使用非ascii字符.

utf8_encode/ decode函数有点奇怪的命名.它们专门在latin1(ISO-8859-1)和utf-8之间进行转换.如果您的应用程序中的所有内容都是utf-8,那么您将不必使用它们.

关于utf-8和PHP至少有两个陷阱.首先,PHP的内置字符串函数希望字符串是单字节的.对于很多操作,这没关系,但它意味着你不能依赖strlen和其他功能.这个页面的限制有很好的破坏.通常,这不是一个大问题,但特别是在使用三方库时,您需要意识到事情可能会爆炸.一个选项也是使用mb_string扩展,它可以选择用utf-8识别替代方法替换所有麻烦的函数.它仍然不是100%防弹解决方案,但它适用于大多数情况.

另一个问题是PHP的某些安装仍然magic_quotes打开了设置.这个问题与utf-8正交,但可能导致一些头部刮伤.为了你自己的理智,把它关掉.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有