重音字符问题 (ADODB + MySQL + PHP)

Problem with accented characters (ADODB + MySQL + PHP)

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

我正在使用 Adodb 5.20.14 版连接到 MySQL 数据库。

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

$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”。

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

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

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

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

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

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

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

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

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