mySQL(和 php)中的特殊字符 - 基础知识
Special characters in mySQL (and php) - THE BASICS
我很困惑!最近我的网络酒店 更新了 php,现在我的旧表格以不同方式(错误地)呈现特殊字符。
我的 表和我的 input/output-php-pages 都设置为 utf-8 并且自从这次更新以来,来自 php 的输入也被区别对待;现在我的特殊字符在进入数据库时被 utf-8 编码。因此,自此更改以来,当我查看 phpMyAdmin 中的表格时,旧插入内容具有原始(未编码)特殊字符 - 新帖子具有 utf-8 编码字符(也是特殊字符)。
所以我想做的是重写输入和输出以插入和显示非编码字符 - 但我不确定如果不完全跳过 utf-8 是否可行(在 php 和 mySQL).但是是否有一种 utf-8 方式来提交非编码字符?
并且 - 也许更根本 - 我需要了解可能的缺点是什么。我正在使用丹麦语字符,我不会使用任何其他语言(对于这个项目)。因此,如果可以使用 utf-8 插入和输出非编码字符 - 我会遇到 unexpected/destructive 问题吗?
我已经阅读了很多关于 php/mySQL/special 字符的帖子,但我还没有看到这个问题的角度。希望我没有重复
我希望不是因为它在更新之前一直运行得很好。
即使你只使用丹麦语字符,你也可以一路使用 utf8。
需要说明编码的地方很多处:
- html
的顶部
- 数据库中的列(CHARACTER SET 列默认来自 table,默认来自数据库)
- 您的 PHP 代码中的编码。
当你 CREATE TABLE
时,加上 DEFAULT CHARACTER SET utf8
。如果您有现有的 tables,但没有,请说出来;我们可能需要对付他们。
如果您想要丹麦语排序规则,也请指定 COLLATION utf8_danish_ci
。然后(如果我没记错的话),aa
将排在 z
之后。
(默认值为 utf8_general_ci
,不会进行该排序。)
弄清楚您的 php 代码中有(或可以获得)什么编码。如果您有一些带有重音符号的文本,请执行以下操作:
$hex = unpack('H*', $text);
echo implode('', $hex)
如果你有 utf8,å 将是 C3A5
,对于 latin1,它将是 E5
。
无论 table 中的编码是什么,您都必须调用 set_charset('utf8') 或 set_charset('latin1'),具体取决于什么编码在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。
我很困惑!最近我的网络酒店 更新了 php,现在我的旧表格以不同方式(错误地)呈现特殊字符。 我的 表和我的 input/output-php-pages 都设置为 utf-8 并且自从这次更新以来,来自 php 的输入也被区别对待;现在我的特殊字符在进入数据库时被 utf-8 编码。因此,自此更改以来,当我查看 phpMyAdmin 中的表格时,旧插入内容具有原始(未编码)特殊字符 - 新帖子具有 utf-8 编码字符(也是特殊字符)。
所以我想做的是重写输入和输出以插入和显示非编码字符 - 但我不确定如果不完全跳过 utf-8 是否可行(在 php 和 mySQL).但是是否有一种 utf-8 方式来提交非编码字符?
并且 - 也许更根本 - 我需要了解可能的缺点是什么。我正在使用丹麦语字符,我不会使用任何其他语言(对于这个项目)。因此,如果可以使用 utf-8 插入和输出非编码字符 - 我会遇到 unexpected/destructive 问题吗?
我已经阅读了很多关于 php/mySQL/special 字符的帖子,但我还没有看到这个问题的角度。希望我没有重复 我希望不是因为它在更新之前一直运行得很好。
即使你只使用丹麦语字符,你也可以一路使用 utf8。
需要说明编码的地方很多处:
- html 的顶部
- 数据库中的列(CHARACTER SET 列默认来自 table,默认来自数据库)
- 您的 PHP 代码中的编码。
当你 CREATE TABLE
时,加上 DEFAULT CHARACTER SET utf8
。如果您有现有的 tables,但没有,请说出来;我们可能需要对付他们。
如果您想要丹麦语排序规则,也请指定 COLLATION utf8_danish_ci
。然后(如果我没记错的话),aa
将排在 z
之后。
(默认值为 utf8_general_ci
,不会进行该排序。)
弄清楚您的 php 代码中有(或可以获得)什么编码。如果您有一些带有重音符号的文本,请执行以下操作:
$hex = unpack('H*', $text);
echo implode('', $hex)
如果你有 utf8,å 将是 C3A5
,对于 latin1,它将是 E5
。
无论 table 中的编码是什么,您都必须调用 set_charset('utf8') 或 set_charset('latin1'),具体取决于什么编码在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。