【问题标题】:Problem with accented characters (ADODB + MySQL + PHP)重音字符问题(ADODB + MySQL + PHP)
【发布时间】:2020-12-09 05:10:01
【问题描述】:

我在开发一个项目时遇到问题,我无法放置重音字符。

我用于连接 MySQL 数据库,Adodb 版本为 5.20.14。

我有一个主配置文件,其中连接设置如下:

$s_driver = "mysqli";
$o_db     = adoNewConnection($s_driver);
$o_db->connect($s_dbhost,$s_dbuser,$s_dbpasswd,$s_dbname);
$o_db->SetFetchMode(ADODB_FETCH_ASSOC);
$o_db->setCharset("utf8");

所有开发的文件都是 UTF-8 编码的,如下图所示:

Image 02

注意:我使用 VsCode。

所有作为页面的 PHP 文件,都将字符集元设置为 utf-8,如下图所示:

<!DOCTYPE html>
<html lang="pt-br">
  <head>
    <meta charset="utf-8">

我的数据库配置为utf8,如下图所示:

Image 04

表配置为 utf8 字符集,如下图所示:

Image 5

列配置为 utf8 字符集,如下图所示:

Image 6

注意:我添加了“NOT NULL”规则来忽略没有字符集配置的表。

在执行查询以将信息包含在数据库中时,我运行如下:

$s_query_incluir = "INSERT INTO agtb_ordensdeservicos(id_agenda,
                                    id_empresa,
                                    hora_ini,
                                    hora_fim,
                                    observacoes,
                                    tipo,
                                    csa)
                        VALUES('".$a_post['add_id_os_dt_agenda']."',
                               '".ID_EMP_ATUAL."',
                               '".$a_post["add_os_hora_ini"]."',
                               '".$a_post['add_os_hora_fim']."',
                               '".$a_post['add_observacao']."',
                               '".$a_post['add_os_tipo']."',
                               '".$a_post['add_os_csa']."');";

$o_db->execute($s_query_incluir);

注意:在文件的顶部,我包含了包含第一张图片中显示的信息的配置文件。

执行此操作后,数据库显示信息如下:

Image 8

在网站上查看信息时,显示如下:

Image 9

原文是这样的:

Image 10

我设法通过在查询中给出“执行”之前添加“setCharset”来使其工作,如下图所示:

$s_query_incluir = "INSERT INTO agtb_ordensdeservicos(id_agenda,
                                    id_empresa,
                                    hora_ini,
                                    hora_fim,
                                    observacoes,
                                    tipo,
                                    csa)
                        VALUES('".$a_post['add_id_os_dt_agenda']."',
                               '".ID_EMP_ATUAL."',
                               '".$a_post["add_os_hora_ini"]."',
                               '".$a_post['add_os_hora_fim']."',
                               '".$a_post['add_observacao']."',
                               '".$a_post['add_os_tipo']."',
                               '".$a_post['add_os_csa']."');";
$o_db->setCharset("utf8");
$o_db->execute($s_query_incluir);

在 MySQL 中实现以下结果:

Image 12

我想知道我哪里出错了。我正在尝试使 utf8 “自动”,而不必在执行任何类型的查询之前调用“setCharset”。

感谢任何形式的帮助。 :)

注意:如果您需要有关该过程的更多信息以更好地了解问题,请告诉我。

【问题讨论】:

  • 参见stackoverflow.com/questions/38363566/… 中的“Mojibake”。并执行建议的SELECT HEX(col)... 以帮助确定在INSERT 或以后的文本是否出现乱码。
  • 我不记得听说过有人使用 adodb。它有什么优势?
  • setCharset 在幕后做了什么? (这很关键。)

标签: php mysql utf-8 collation adodb


【解决方案1】:

我已经确定了问题的原因。

即使配置了UTF-8/utf8_general_ci的数据库、表和列以及UTF-8的PHP文件,奇怪字符的问题依然存在。

问题在于格式化文本的标准 PHP 函数,包括:

strtolower()
strtoupper()
ucfirst()
ucwords()

在重音文本(例如,“acentuação”)中执行这些函数时,它们的返回值会丢失。 从我的整个项目中删除这些函数后,数据库中的奇怪字符问题不再发生(包括通过 PHP 和 MySQL Workbench 进行查询)。

我希望这可以帮助其他最终遇到与我相同问题的人。 :)

注意:我花了很长时间才回答,因为我只有在将这些更改置于生产环境中后才能验证此信息。

【讨论】:

  • 很高兴你找到了它。因此,您应该查看 PHP mbstring,并且您的 SQL 应该使用 utf8mb4_
猜你喜欢
  • 2011-08-07
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多