Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-32975

Default charset doesn't work with PHP MySQLi extension

Details

    Description

      Some charset change in MariaDB 11.3.1 appears to break PHP clients, raising the error 'Server sent charset (0) unknown to the client'.

      I noticed /etc/mysql/mariadb.conf.d/50-server.cnf changed
      collation-server = utf8mb4_general_ci (11.2.2)
      to
      character-set-collations = utf8mb4=uca1400_ai_ci (11.3.1)

      If I change this back, connections from PHP work again.

      This Plesk user seems to have encountered the same issue: https://talk.plesk.com/threads/500-plesk-exception-database-db-query-failed-sqlstate-hy000-2054-server-sent-charset-0-unknown-to-the-client.372563/

      Steps to reproduce:

      • Install PHP 8.3, including MySQLi extension.
      • Install MariaDB 11.3.1, CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';.
      • Test a PHP page, e.g.

                                                                                            
        <?php
        error_reporting(E_ALL);
        ini_set('display_errors', 'on');
        $conn = new mysqli("localhost", "username", "password");
        if ($conn->connect_error) {
          die("Connection failed: " . $conn->connect_error);
        }
        echo "Connected successfully";
        ?>
        

      • Observe error:

        Fatal error: Uncaught mysqli_sql_exception: Server sent charset (0) unknown to the client. Please, report to the developers in /var/www/html/index.php:4 Stack trace: #0 /var/www/html/index.php(4): mysqli->__construct() #1 {main} thrown in /var/www/html/index.php on line 4
        

      Attachments

        Issue Links

          Activity

            serg Sergei Golubchik added a comment - - edited

            We have some, builders at buildbot.mariadb.org with the "eco" in the name:

            • amd64-debian-10-eco-mysqljs
            • amd64-debian-10-eco-pymysql
            • amd64-ubuntu-2004-eco-php

            but they aren't enforced yet, still work in progress.

            serg Sergei Golubchik added a comment - - edited We have some, builders at buildbot.mariadb.org with the "eco" in the name: amd64-debian-10-eco-mysqljs amd64-debian-10-eco-pymysql amd64-ubuntu-2004-eco-php but they aren't enforced yet, still work in progress.

            We should maybe considering fixing / reverting this patch as part of this: https://github.com/MariaDB/server/pull/2775

            TheLinuxJedi Andrew Hutchings (Inactive) added a comment - We should maybe considering fixing / reverting this patch as part of this: https://github.com/MariaDB/server/pull/2775
            danblack Daniel Black added a comment - - edited

            Backout of config default in the Docker Official Image as workaround:
            https://github.com/MariaDB/mariadb-docker/pull/565

            And re-released:

            https://github.com/docker-library/official-images/pull/16293
            (will be up once Docker Library CI finishes (few hrs max)) - there now. Just re-pull if you are depending on this.

            danblack Daniel Black added a comment - - edited Backout of config default in the Docker Official Image as workaround: https://github.com/MariaDB/mariadb-docker/pull/565 And re-released: https://github.com/docker-library/official-images/pull/16293 (will be up once Docker Library CI finishes (few hrs max)) - there now. Just re-pull if you are depending on this.
            danblack Daniel Black added a comment -

            FYI 10.11 compile fix:

            ql_acl.cc.o -MF sql/CMakeFiles/sql.dir/sql_acl.cc.o.d -o sql/CMakeFiles/sql.dir/sql_acl.cc.o -c /home/dan/repos/mariadb-server-10.11/sql/sql_acl.cc
            /home/dan/repos/mariadb-server-10.11/sql/sql_acl.cc:13365:59: error: no member named 'csname' in 'charset_info_st'
             13365 |     CHARSET_INFO *cs= get_charset_by_csname(handshake_cs->csname,
                   |                                             ~~~~~~~~~~~~  ^
            1 error generated.
            

            diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
            index e7cded79fd1..6885e406548 100644
            --- a/sql/sql_acl.cc
            +++ b/sql/sql_acl.cc
            @@ -13362,7 +13362,7 @@ static bool send_server_handshake_packet(MPVIO_EXT *mpvio,
                   A workaround for a 2-byte collation ID: translate it into
                   the ID of the primary collation of this character set.
                 */
            -    CHARSET_INFO *cs= get_charset_by_csname(handshake_cs->csname,
            +    CHARSET_INFO *cs= get_charset_by_csname(handshake_cs->cs_name.str,
                                                         MY_CS_PRIMARY, MYF(MY_WME));
                 /*
                   cs should not normally be NULL, however it may be possible
            
            

            danblack Daniel Black added a comment - FYI 10.11 compile fix: ql_acl.cc.o -MF sql/CMakeFiles/sql.dir/sql_acl.cc.o.d -o sql/CMakeFiles/sql.dir/sql_acl.cc.o -c /home/dan/repos/mariadb-server-10.11/sql/sql_acl.cc /home/dan/repos/mariadb-server-10.11/sql/sql_acl.cc:13365:59: error: no member named 'csname' in 'charset_info_st' 13365 | CHARSET_INFO *cs= get_charset_by_csname(handshake_cs->csname, | ~~~~~~~~~~~~ ^ 1 error generated. diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index e7cded79fd1..6885e406548 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -13362,7 +13362,7 @@ static bool send_server_handshake_packet(MPVIO_EXT *mpvio, A workaround for a 2-byte collation ID: translate it into the ID of the primary collation of this character set. */ - CHARSET_INFO *cs= get_charset_by_csname(handshake_cs->csname, + CHARSET_INFO *cs= get_charset_by_csname(handshake_cs->cs_name.str, MY_CS_PRIMARY, MYF(MY_WME)); /* cs should not normally be NULL, however it may be possible
            bar Alexander Barkov added a comment - - edited

            This is expected. A some point the CHARSET_INFO member "const char * csname" was changed to "LEX_CSTRING *cs_name".

            During the merge:

            handshake_cs->csname
            

            should be changed to:

            handshake_cs->cs_name.str
            

            bar Alexander Barkov added a comment - - edited This is expected. A some point the CHARSET_INFO member "const char * csname" was changed to "LEX_CSTRING *cs_name". During the merge: handshake_cs->csname should be changed to: handshake_cs->cs_name.str

            People

              bar Alexander Barkov
              Quppa David Warner
              Votes:
              3 Vote for this issue
              Watchers:
              12 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.