【问题标题】:can't show special characters retrieved from AES_DECRYPT无法显示从 AES_DECRYPT 检索到的特殊字符
【发布时间】:2017-01-07 02:05:43
【问题描述】:

我正在使用 codeigniter。
运行以下查询后:

$names = this->db->query("SELECT AES_DECRYPT(nombre,'".$key."') AS nombre FROM places")

我从 var_dump($names) 得到以下输出

[43]=>
array(1) {
  ["nombre"]=>
  string(41) "Industriales de Campeche"
}
[44]=>
array(1) {
  ["nombre"]=>
  string(67) "Evaristo Garc�a ESE"
}
[45]=>
array(1) {
  ["nombre"]=>
  string(39) "San Jose Popay�n"

在 phpmyadmin 上的查询结果如下:

如您所见,包含特殊字符的字段以十六进制表示。当我使用这个工具http://www.rapidtables.com/convert/number/hex-to-ascii.htm 时,我可以毫无问题地转换十六进制字段(显示特殊字符),但问题是我不能让它在 codeigniter 中工作。即使我使用的是 utf-8 编码,特殊字符仍然显示为 �。

值得一提的是,在加密数据库之前我没有遇到任何问题。

【问题讨论】:

  • 我都试过了
  • 你说“我都试过了”,但你真的读了吗? MySQL utf-8 编码是 not UTF-8 编码。我假设您的数据列是blob 类型?和/或unicode?请详细说明您的表结构。

标签: php mysql codeigniter encryption


【解决方案1】:

你需要做两件事

  1. 将表和字段排序规则设置为“utf8_general_ci”
  2. 在 HTML 中设置元内容类型,如下所示

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    

【讨论】:

  • 对不起,但这完全没有帮助,可能值得阅读 Sammitch 在他的 cmets 中给出的 the link
【解决方案2】:
  • 检查您的 MySQL 数据列是否使用 _unicode_utf8mb4_ 字符排序规则。还要检查您的整个表格是否使用相同的字符集(在 PHPMyAdmin 中查看 &lt;table&gt; -&gt; Operations -&gt; Collation )。

  • 检查您的 MySQL 连接是否使用UTF8mb4_ 连接字符集(见下文)。

  • 检查您的 HTML 标头是否设置为 UTF-8(标头不是页面的 &lt;head&gt; 部分,虽然这不能设置为 UTF-8 也很痛苦。)。

我很确定您的问题在于您从 PHP(或其他)到数据库的 连接 不是所需的完整 UTF-8 字符集。

 // In your database connection class. 
 // Once initial contact has been established
 $this->dbObject->set_charset("utf8mb4");

进一步阅读: UTF-8 all the way through

【讨论】:

    猜你喜欢
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2015-12-19
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多