mySQL(和php)中的特殊字符 - 基础知识

时间:2015-03-06 16:37:43

标签: php mysql encoding utf-8 character-encoding

我很困惑!最近我的webhotel 更新了php ,现在我的旧表以不同的方式呈现特殊字符(错误地)。 我的表和我的input / output-php-pages都设置为utf-8 ,自此更新以来,来自php的输入也被区别对待;现在我的特殊字符在进入数据库时​​正在进行utf-8编码。因此,自从此更改后,当我查看phpMyAdmin中的表时,旧插入具有原始(非编码)特殊字符 - 新帖子具有utf-8编码的字符(也是特殊的)。

所以我想要做的是重写输入和输出以插入和显示非编码字符 - 但我不确定这是否可行而不完全跳过utf-8(在php和mySQL中)。但是否有提交非编码字符的方式?

AND - 或许更根本 - 我需要了解可能存在的缺点。我正在使用丹麦语字符,我不会使用任何其他语言(对于这个项目)。因此,如果可以使用utf-8插入和输出非编码字符 - 我是否会遇到意外/破坏性问题?

我已经阅读了很多关于php / mySQL /特殊字符的帖子,但我还没有看到这个问题。希望我不是重复 我希望不是因为它在更新之前一直很好用。

1 个答案:

答案 0 :(得分:2)

即使你只使用丹麦语字符,你也可以一直使用utf8。

许多位置需要说明编码:

  • 位于html顶部
  • 数据库中的列(列CHARACTER SET默认来自表,默认来自数据库)
  • PHP代码中的编码。

当你CREATE TABLE时,请DEFAULT CHARACTER SET utf8。如果您有现有的表,没有它,请说出来;我们可能需要处理它们。 如果您想要丹麦语排序规则,请指定COLLATION utf8_danish_ci。然后(如果我没记错的话),aa将在z之后排序。 (默认值为utf8_general_ci,不会进行排序。) 找出你的PHP代码中你有(或可以获得)的编码。如果您有一些带重音的文字,请执行以下操作:

$hex = unpack('H*', $text);
echo implode('', $hex)

如果你有utf8,å将是C3A5,对于latin1,它将是E5

无论表中的编码是什么,都必须调用set_charset('utf8')或set_charset('latin1'),具体取决于PHP中数据的编码。当PHP在PHP和MySQL之间传递时,MySQL很乐意在latin1和utf8之间进行转码。对于不同的API:

⚈  mysql: mysql_set_charset('utf8');
⚈  mysqli: $mysqli_obj->set_charset('utf8');
⚈  PDO: $db = new PDO('dblib:host=host;dbname=db;charset=UTF-8', $user, $pwd);

有关详情,请参阅http://mysql.rjweb.org/doc.php/charcoll