una tabla parte palabra fulltext ejemplos datos consultas consultar consulta coincidencias buscar buscador mysql

tabla - Buscar todas las ocurrencias de una cadena en una base de datos mysql



consultas en mysql (18)

Esta pregunta ya tiene una respuesta aquí:

Estoy intentando descubrir cómo localizar todas las apariciones de una url en una base de datos. Quiero buscar todas las tablas y todos los campos. Pero no tengo idea de por dónde empezar o si es posible.


En phpMyAdmin , la función ''Buscar'' está disponible:

  1. Seleccione una base de datos particular, no una tabla.
  2. Haga clic en la pestaña ''Buscar''
  3. Ingrese el término de búsqueda que desea
  4. Seleccione las tablas en las que desea buscar

Captura de pantalla de phpMyAdmin :

La función ''Buscar'' también está disponible en MySQL Workbench :

  1. Menú de la base de datos> Buscar datos de tabla
  2. Seleccione la base de datos y las tablas que desea buscar (buscará solo en las tablas seleccionadas)
  3. En la búsqueda puedes usar wildChars.

Captura de pantalla de MySQL Workbench :


En máquinas Unix, si la base de datos no es demasiado grande:

mysqldump -u <username> -p <password> <database_name> --extended=FALSE | grep <String to search> | less -S


Encontré una manera con dos (2) códigos fáciles here . Primero haz un mysqldump :

mysqldump -uUSERNAME -p DATABASE_NAME > database-dump.sql

luego grep el archivo sqldump:

grep -i "Search string" database-dump.sql

También es possible find/replace y re-import a la base de datos.



Estaba buscando esto por mí mismo cuando cambiamos de dominio en nuestro sitio web Wordpress. No se puede hacer sin una programación así que esto es lo que hice.

<?php header("Content-Type: text/plain"); $host = "localhost"; $username = "root"; $password = ""; $database = "mydatabase"; $string_to_replace = ''old.example.com''; $new_string = ''new.example.com''; // Connect to database server mysql_connect($host, $username, $password); // Select database mysql_select_db($database); // List all tables in database $sql = "SHOW TABLES FROM ".$database; $tables_result = mysql_query($sql); if (!$tables_result) { echo "Database error, could not list tables/nMySQL error: " . mysql_error(); exit; } echo "In these fields ''$string_to_replace'' have been replaced with ''$new_string''/n/n"; while ($table = mysql_fetch_row($tables_result)) { echo "Table: {$table[0]}/n"; $fields_result = mysql_query("SHOW COLUMNS FROM ".$table[0]); if (!$fields_result) { echo ''Could not run query: '' . mysql_error(); exit; } if (mysql_num_rows($fields_result) > 0) { while ($field = mysql_fetch_assoc($fields_result)) { if (stripos($field[''Type''], "VARCHAR") !== false || stripos($field[''Type''], "TEXT") !== false) { echo " ".$field[''Field'']."/n"; $sql = "UPDATE ".$table[0]." SET ".$field[''Field'']." = replace(".$field[''Field''].", ''$string_to_replace'', ''$new_string'')"; mysql_query($sql); } } echo "/n"; } } mysql_free_result($tables_result); ?>

Espero que ayude a cualquiera que esté tropezando con este problema en el futuro :)




Método de fuerza bruta

declare @url varchar(255) set @url = ''.com'' select ''select * from '' + rtrim(tbl.name) + '' where '' + rtrim(col.name) + '' like %'' + rtrim(@url) + ''%'' from sysobjects tbl inner join syscolumns col on tbl.id = col.id and col.xtype in (167, 175, 231, 239) -- (n)char and (n)varchar, there may be others to include and col.length > 30 -- arbitrary min length into which you might store a URL where tbl.type = ''U'' -- user defined table

Esto creará una secuencia de comandos que podría ejecutar en la base de datos.

select * from table1 where col1 like ''%.com%'' select * from table1 where col2 like ''%.com%'' select * from table2 where col3 like ''%.com%''

etc.


MikeW presentó una solución interesante, pero como se menciona en los comentarios, es una solución de SQL Server y no de MySQL. Aquí hay una solución MySQL:

use information_schema; set @q = ''Boston''; set @t = ''my_db''; select CONCAT(''use /''',@q,''/';'') as q UNION select CONCAT(''select /''', tbl.`TABLE_NAME`,''/' as TableName, /''', col.`COLUMN_NAME`,''/' as Col, `'',col.`COLUMN_NAME`,''` as value from `'' , tbl.`TABLE_NAME`,''` where `'' , col.`COLUMN_NAME` , ''` like /'%'' ,@q, ''%/' UNION'') AS q from `tables` tbl inner join `columns` col on tbl.`TABLE_NAME` = col.`TABLE_NAME`and col.DATA_TYPE=''varchar'' where tbl.TABLE_SCHEMA = @t ;


No es una solución elegante, pero podría lograrlo con una estructura de bucle anidado

// select tables from database and store in an array // loop through the array foreach table in database { // select columns in the table and store in an array // loop through the array foreach column in table { // select * from table where column = url } }

Probablemente puedas acelerar esto comprobando qué columnas contienen cadenas mientras construyes tu matriz de columnas, y también combinando todas las columnas por tabla en una cláusula WHERE gigante separada por comas.


No recuerdo dónde encontré este script, pero lo he estado utilizando con XCloner para mover mis multisitios WP.

<?php // Setup the associative array for replacing the old string with new string $replace_array = array( ''FIND'' => ''REPLACE'', ''FIND'' => ''REPLACE''); $mysql_link = mysql_connect( ''localhost'', ''USERNAME'', ''PASSWORD'' ); if( ! $mysql_link) { die( ''Could not connect: '' . mysql_error() ); } $mysql_db = mysql_select_db( ''DATABASE'', $mysql_link ); if(! $mysql_db ) { die( ''Can/'t select database: '' . mysql_error() ); } // Traverse all tables $tables_query = ''SHOW TABLES''; $tables_result = mysql_query( $tables_query ); while( $tables_rows = mysql_fetch_row( $tables_result ) ) { foreach( $tables_rows as $table ) { // Traverse all columns $columns_query = ''SHOW COLUMNS FROM '' . $table; $columns_result = mysql_query( $columns_query ); while( $columns_row = mysql_fetch_assoc( $columns_result ) ) { $column = $columns_row[''Field'']; $type = $columns_row[''Type'']; // Process only text-based columns if( strpos( $type, ''char'' ) !== false || strpos( $type, ''text'' ) !== false ) { // Process all replacements for the specific column foreach( $replace_array as $old_string => $new_string ) { $replace_query = ''UPDATE '' . $table . '' SET '' . $column . '' = REPLACE('' . $column . '', /''' . $old_string . ''/', /''' . $new_string . ''/')''; mysql_query( $replace_query ); } } } } } mysql_free_result( $columns_result ); mysql_free_result( $tables_result ); mysql_close( $mysql_link ); echo ''Done!''; ?>


Publicaciones antiguas que sé, pero para otras que encuentran esto en Google como lo hice, si tiene instalado phpmyadmin, tiene una función de búsqueda global.


Puede hacer esto usando HeidiSQL sin generar volcados de Db

Pasos :

1) Seleccione la base de datos que necesita buscar desde el panel izquierdo de GUI.

2) Exportar> Exportar base de datos como SQL

3) En la ventana Herramientas de tabla, seleccione la pestaña " ENCONTRAR TEXTO ".

4) Proporcione su cadena para buscar y haga clic en " ENCONTRAR ".

5) Enumerará todas las tablas que contienen nuestra cadena.

6) Seleccione la fila con mayor relevancia% .

7) Haga clic en " VER RESULTADOS "


Scott da un buen ejemplo de cómo hacerlo, pero la pregunta es ¿por qué querrías? Si necesita buscar y reemplazar en una cadena específica, también podría tratar de hacer un mysqldump de su base de datos, hacer una búsqueda y reemplazo en un editor, luego volver a cargar la base de datos.

Tal vez si usted dio algunos antecedentes sobre lo que está tratando de lograr, otros podrían proporcionar mejores respuestas.


Si puede usar un bash, aquí hay un script: necesita un dbread de usuario con pass dbread en la base de datos.

#!/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

Si alguien quiere una explicación: http://infofreund.de/?p=1670


Una solución simple sería hacer algo como esto:

mysqldump -u myuser --no-create-info --extended-insert=FALSE databasename > myfile.sql

A continuación, puede hacer una búsqueda en myfile.sql para la URL que desea.


Usando MySQL Workbench, puede buscar una cadena desde la opción de menú "Base de datos" -> "Buscar datos de tabla".

Especifique LIKE% URL_TO_SEARCH% y en el lado izquierdo seleccione todas las tablas que desea buscar. Puede usar "Cntrl + A" para seleccionar todo el árbol a la izquierda y luego deseleccionar los objetos que no le interesan.


SQLyog es una solución basada en la GUI para el problema de la búsqueda de datos en todas las columnas, tablas y bases de datos. Se puede personalizar la búsqueda restringiéndola a campo, tabla y bases de datos.

En su función de Data Search , uno puede buscar cadenas de la misma forma que uno usa Google.