]> git.joonet.de Git - adminer.git/commitdiff
MySQL: Support non-utf8 charset in search in column
authorJakub Vrana <jakub@vrana.cz>
Tue, 6 Feb 2018 12:19:12 +0000 (13:19 +0100)
committerJakub Vrana <jakub@vrana.cz>
Tue, 6 Feb 2018 12:51:23 +0000 (13:51 +0100)
adminer/drivers/mysql.inc.php
adminer/include/adminer.inc.php
adminer/include/driver.inc.php
changes.txt

index 3a974d1dc7671b5c03f8c622b085a9e3fc5f7193..249b3dd2068e9721f27523db425f7c7db82c8b50 100644 (file)
@@ -277,6 +277,13 @@ if (!defined("DRIVER")) {
                        return queries($prefix . implode(",\n", $values) . $suffix);
                }
                
+               function convertSearch($idf, $field) {
+                       return (preg_match('~char|text|enum|set~', $field["type"]) && !preg_match("~^utf8~", $field["collation"])
+                               ? "CONVERT($idf USING " . charset($this->_conn) . ")"
+                               : $idf
+                       );
+               }
+               
                function warnings() {
                        $result = $this->_conn->query("SHOW WARNINGS");
                        if ($result && $result->num_rows) {
index 413ca3bad57d317b74694cef1f849cecadba9de1..4a1f2aae8a93b247f66e4c07b5940f320ea13310 100644 (file)
@@ -504,7 +504,7 @@ class Adminer {
        * @return array expressions to join by AND
        */
        function selectSearchProcess($fields, $indexes) {
-               global $connection, $jush;
+               global $connection, $driver;
                $return = array();
                foreach ($indexes as $i => $index) {
                        if ($index["type"] == "FULLTEXT" && $_GET["fulltext"][$i] != "") {
@@ -534,17 +534,15 @@ class Adminer {
                                        $cond .= " " . $this->processInput($fields[$val["col"]], $val["val"]);
                                }
                                if ($val["col"] != "") {
-                                       $return[] = $prefix . idf_escape($val["col"]) . $cond;
+                                       $return[] = $prefix . $driver->convertSearch(idf_escape($val["col"]), $fields[$val["col"]]) . $cond;
                                } else {
                                        // find anywhere
                                        $cols = array();
                                        foreach ($fields as $name => $field) {
-                                               $is_text = preg_match('~char|text|enum|set~', $field["type"]);
                                                if ((is_numeric($val["val"]) || !preg_match('~' . number_type() . '|bit~', $field["type"]))
-                                                       && (!preg_match("~[\x80-\xFF]~", $val["val"]) || $is_text)
+                                                       && (!preg_match("~[\x80-\xFF]~", $val["val"]) || preg_match('~char|text|enum|set~', $field["type"]))
                                                ) {
-                                                       $name = idf_escape($name);
-                                                       $cols[] = $prefix . ($jush == "sql" && $is_text && !preg_match("~^utf8~", $field["collation"]) ? "CONVERT($name USING " . charset($connection) . ")" : $name) . $cond;
+                                                       $cols[] = $prefix . $driver->convertSearch(idf_escape($name), $field) . $cond;
                                                }
                                        }
                                        $return[] = ($cols ? "(" . implode(" OR ", $cols) . ")" : "1 = 0");
index 69e1aa492094b00b2c79b3c5c2d46798bfe0d2eb..c16481aad14cf985149a5b8bde67e1bf68b5e401 100644 (file)
                return queries("ROLLBACK");
        }
        
+       /** Convert column to be searchable
+       * @param string escaped name
+       * @param array
+       * @return string
+       */
+       function convertSearch($idf, $field) {
+               return $idf;
+       }
+       
        /** Get warnings about the last command
        * @return string HTML
        */
index 2550fb45d23398a41166642561c13ebf2be2b739..d3289bcf3d9e759b2d99b7fc24f8d1d074195ed7 100644 (file)
@@ -1,4 +1,5 @@
 Adminer 4.6.1-dev:
+MySQL: Support non-utf8 charset in search in column
 MySQL: Support geometry in MySQL 8 (bug #574)
 PostgreSQL: Don't treat interval type as number (bug #474)
 PostgreSQL: Fix condition for selecting no rows