mySQL(和php)中的特殊字符-BASICS


Special characters in mySQL (and php) - THE BASICS

我很困惑!最近,我的webhotel更新了php,现在我的旧表以不同的方式(错误地)呈现特殊字符。我的表和我的输入/输出php页面都被设置为utf-8,由于这次更新,php的输入也被区别对待;现在,我的特殊字符在进入数据库时被utf-8编码。因此,由于这一变化,当我在phpMyAdmin中查看表时,旧的插入具有原始的(未编码的)特殊字符——新的帖子具有utf-8编码的字符(也是特殊的)。

因此,我想做的是重写输入和输出,以插入和显示未编码的字符,但如果不完全跳过utf-8(在php和mySQL中),我不确定这是否可行。但是有一种utf-8提交非编码字符的方法吗

而且——也许更根本的是——我需要了解可能的负面影响是什么。我在里面和外面使用丹麦语字符,我不会使用任何其他语言(对于这个项目)。那么,如果可以使用utf-8-插入和输出未编码的字符,那么我会遇到意外/破坏性的问题吗

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

即使您只使用丹麦语字符,也可以一直使用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中数据中的编码。MySQL很乐意在latin1和utf8之间进行代码转换,因为事情在PHP和MySQL之间传递。对于不同的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。