it-swarm-eu.dev

Jak hledat v celé databázi MySQL konkrétní řetězec

je možné prohledat celé databázové tabulky (řádek a sloupec) a zjistit konkrétní řetězec.

Mám databázi s názvem A s asi 35 tabulkami, musím hledat řetězec s názvem "ahoj" a já nevím, na které tabulce je tento řetězec uložen. Je to možné?

Používání MySQL

jsem linuxový admin a nejsem obeznámen s databázemi, bylo by opravdu užitečné, kdyby u mohl vysvětlit dotaz také.

21
Kevin Parker
$ mysqldump -pPASSWORD database --extended=FALSE | grep pattern | less -S

Více: http://winashwin.wordpress.com/2012/08/28/mysql-search/

17
Javier López

V červenci 2012 jsem napsal tento příspěvek

Dotaz na nalezení a nahrazení textu ve všech tabulkách a polích mysql db

Používá tabulku information_schema.columns k vyzvednutí každého pole CHAR, VARCHAR a TEXT a provedení textového [~ # ~] nahradit [~ # ~] .

Podívejte se prosím na můj starý odkaz a použijte jeho paradigma k vyhledávání.

Jako příklad se vytvoří samostatný SELECT pro každý textový sloupec v každé tabulce

SELECT
    CONCAT('SELECT ',QUOTE(db),',',QUOTE(tb),',',QUOTE(col),',COUNT(1) FieldHasIt
    FROM ',db,'.',tb,' WHERE \`',col,'\`=''',SearchString,''';') SearchSQL
FROM
(
    SELECT table_schema db,table_name tb,column_name col FROM information_schema.columns
    WHERE table_schema = 'mydb' AND
    (column_type LIKE 'char(%' OR column_type LIKE 'varchar(%' OR column_type LIKE '%text')
) A,(SELECT 'Hello' SearchString) B;

Vytvořte s ním obrovský textový soubor. Poté spusťte tento obrovský skript SQL:

SQL="SELECT CONCAT('SELECT ',QUOTE(db),',',QUOTE(tb),',',"
SQL="${SQL} QUOTE(col),',COUNT(1) FieldHasIt FROM ',db,'.',tb,'"
SQL="${SQL} WHERE \`',col,'\`=''',SearchString,''';') SearchSQL FROM"
SQL="${SQL} (SELECT table_schema db,table_name tb,column_name col FROM"
SQL="${SQL} information_schema.columns WHERE table_schema='store_qa'"
SQL="${SQL} AND (column_type LIKE 'char(%' OR column_type LIKE 'varchar(%'"
SQL="${SQL} OR column_type LIKE '%text')) A,(SELECT 'Hello' SearchString) B;"

mysql -uroot -p... -ANe"${SQL}" > MegaSearch.sql
mysql -uroot -p... -AN < MegaSearch.sql > MegaSearchResults.txt
RESULTS_FOUND=`grep -c "1$" < MegaSearchResults.txt`
echo ${RESULTS_FOUND}
if [ ${RESULTS_FOUND} -gt 0 ] ; then grep "1$" < MegaSearchResults.txt ; fi

Výstup vám řekne databázi, tabulku a sloupec, ve kterém jsou data zobrazena.

Pokusit se !!!.

UPRAVIT:

CONCAT('SELECT ',QUOTE(db),',',QUOTE(tb),',',QUOTE(col),',COUNT(1) FieldHasIt
        FROM ',db,'.',tb,' WHERE \`',col,'\`=''',SearchString,''';')

BY MĚL: přidat dvě zadní zaškrtávací políčka uvedená níže pro tabulky, které mají v názvu mezeru.

db,'.`',tb,'`',' WHERE
7
RolandoMySQLDBA

Když jsem použil jiný přístup, který nevyžaduje vytváření dotazů SQL, vyvinul jsem CRGREP jako bezplatný nástroj příkazového řádku opensource, který bude grepovat databáze (včetně MySQL) a podporuje oba jednoduchý typ „fred customer.name“ vyhledává výraz „fred“ ve sloupci „name“ tabulky „customer“, aby se složitější porovnávání vzorů, jako je „fr? d * .author“, shodovalo se všemi sloupci „author“ napříč všechny tabulky.

2
Craig

Můžete vrátit všechny sloupce ze všech tabulek, které se shodují s hodnotami, které hledáte, najednou tím, že oddělíte odpověď RolandoMySQLDBA a pomocí PREPARE a EXECUTE pro spuštění dotaz .

-- Your values
SET @table_schema = 'your_table_name';
SET @condition = "LIKE '%your string to search%'";
SET @column_types_regexp = '^((var)?char|(var)?binary|blob|text|enum|set)\\(';

-- Reset @sql_query in case it was used previously
SET @sql_query = '';

-- Build query for each table and merge with previous queries with UNION
SELECT
    -- Use `DISTINCT IF(QUERYBUILDING, NULL, NULL)`
    -- to only select a single null value
    -- instead of selecting the query over and over again as it's built
    DISTINCT IF(@sql_query := CONCAT(
        IF(LENGTH(@sql_query), CONCAT(@sql_query, " UNION "), ""),
        'SELECT ',
            QUOTE(CONCAT('`', `table_name`, '`.`', `column_name`, '`')), ' AS `column`, ',
            'COUNT(*) AS `occurrences` ',
        'FROM `', `table_schema`, '`.`', `table_name`, '` ',
        'WHERE `', `column_name`, '` ', @condition
    ), NULL, NULL) `query`
FROM (
    SELECT
        `table_schema`,
        `table_name`,
        `column_name`
    FROM `information_schema`.`columns`
    WHERE `table_schema` = @table_schema
    AND `column_type` REGEXP @column_types_regexp
) `results`;
select @sql_query;

-- Only return results with at least one occurrence
SET @sql_query = CONCAT("SELECT * FROM (", @sql_query, ") `results` WHERE `occurrences` > 0");

-- Run built query
PREPARE statement FROM @sql_query;
EXECUTE statement;
DEALLOCATE PREPARE statement;
2
0b10011

Pokud můžete použít bash - zde je skript: Potřebuje uživatele dbread s pass dbread v databázi.

#!/bin/bash
IFS='
'
DBUSER=dbread
DBPASS=dbread
echo -n "Which database do you want to search in (press 0 to see all databases): " 
read DB
echo -n "Which string do you want to search: " 
read SEARCHSTRING
for i in `mysql $DB -u$DBUSER -p$DBPASS -e "show tables" | grep -v \`mysql $DB -u$DBUSER -p$DBPASS -e "show tables" | head -1\``
do
for k in `mysql $DB -u$DBUSER -p$DBPASS -e "desc $i" | grep -v \`mysql $DB -u$DBUSER -p$DBPASS -e "desc $i" | head -1\` | grep -v int | awk '{print $1}'`
do
if [ `mysql $DB -u$DBUSER -p$DBPASS -e "Select * from $i where $k='$SEARCHSTRING'" | wc -l` -gt 1 ]
then
echo " Your searchstring was found in table $i, column $k"
fi
done
done

Pokud chce někdo vysvětlení: http://infofreund.de/?p=167

1
chris2k

Pokud jste Linuxový administrátor, měli byste být obeznámeni s příkazovým řádkem, takže tento by byl užitečný:

$ mysqldump -u root -proot --skip-extended-insert db_name | grep --color=auto -w foo

Změňte root/root na vaše pověření mysql (nebo použijte ~/.my.cnf), db_name k názvu databáze a foo pro hledaný text. Parametr --skip-extended-insert pro mysqldump zobrazí každý dotaz v samostatných řádcích. Parametr --color=auto pro grep zvýrazní váš řetězec a -w bude odpovídat celému slovu.

1
kenorb

Pokud používáte MySQL Workbench, klikněte pravým tlačítkem na schéma databáze a vyberte "Vyhledat data tabulky ..." a poté vyplňte formulář. Tím se prohledá celá databáze. Když (nebo pokud) výsledky přijdou, kliknutím na šipku rozbalte. Ukáže schéma, tabulku, data primárního klíče, název sloupce a skutečná data, která odpovídají vašemu vyhledávání.
Tip: Pokud nic nepřijde, zkuste rozšířit hledání.
Upozorňujeme, že je to opravdu užitečné pouze při vyhledávání textových datových typů (char, varchar a text).

0
kurdtpage

Zaměřuji se na jednoduché řešení šablon pro vaši otázku implementovanou v plsql pro Oracle databázi, doufám, že si ji přizpůsobíme na MySql, což je jednoduché google google. vše, co potřebujete, je prozkoumat informační schéma na MySql a nahradit nějaký název tabulky a sloupce.

Ve skriptu: ALL_TAB_COLUMNS je tabulka informačních schémat obsahující všechny sloupce tabulky 'VARCHAR2', 'NVARCHAR2', 'NCHAR', 'CHAR' odkazuje na typy sloupců řetězců v Oracle, musíte je nahradit ekvivalentními názvy typů MySql
% hello% je hledané klíčové slovo, které nahradí řetězcem.

Výsledkem budou některé nebo více skriptů sql (na základě typů sloupců tabulek) a jejich spuštění povede k vaší odpovědi
Také výkon a časová náročnost budou další záležitosti.
Doufám, že to bude užitečné

SELECT 
'SELECT ' || ALL_TAB_COLUMNS.COLUMN_NAME  || ' AS RESULT_FOUND, ' 
|| '''' || ALL_TAB_COLUMNS.TABLE_NAME ||''''|| ' AS TABLE_NAME, '
|| '''' || ALL_TAB_COLUMNS.COLUMN_NAME ||''''|| ' AS COLUMN_NAME '
|| 'FROM ' || ALL_TAB_COLUMNS.OWNER ||'.'||ALL_TAB_COLUMNS.TABLE_NAME  
|| ' WHERE ' || ALL_TAB_COLUMNS.COLUMN_NAME || ' LIKE ''%hello%''' || ';'
FROM ALL_TAB_COLUMNS 
WHERE 
ALL_TAB_COLUMNS.OWNER = 'SCOTT'
AND 
ALL_TAB_COLUMNS.DATA_TYPE IN ('VARCHAR2','NVARCHAR2','NCHAR','CHAR')
0
Mohsen Heydari

Máte přístup k phpMyAdmin? Má vyhledávací funkci pro každou databázi.

nebo použijte skriptování podle vašeho výběru na základě výsledku (změna názvu dbname):

$string = 'mysqldump --compact --skip-extended-insert -u ' . $db_user . ' -p' . $db_password . ' dbname 2>&1 | grep "particular string" 2>&1';
$result = Shell_exec ( $string );
0
David

Existuje knihovna Nice pro čtení všech tabulek, ridona

$database = new ridona\Database('mysql:dbname=database_name;Host=127.0.0.1', 'db_user','db_pass');

foreach ($database->tables(['table_name1','table_name2'])->by_entire() as $row) {

  do...

}
0
mirhossein

Použijte tento trik s jedním řádkem kódu

SELECT * FROM `table_name1`,`table_name2` 
WHERE '$data' IN (`column_name1`,`column_name2`,`column_name3`,`column_name4`);

column_name: Zadejte všechny názvy sloupců, ve kterých hledáte.

název_tabulky: Zadejte veškerý název tabulky, ve kterém hledáte.

0
Sahil Jangra

Pokud máte nainstalovaný phpMyAdmin, použijte jeho funkci 'Hledat'.

Vyberte svou databázi DataBase Ujistěte se, že jste vybrali databázi DataBase, nikoli tabulku, jinak se zobrazí úplně jiné dialogové okno pro vyhledávání

  1. Klikněte na kartu „Hledat“
  2. Položka seznamu Vyberte hledaný výraz
  3. Vyberte tabulky pro vyhledávání
0
Anil Gupta