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:
- Seleccione una base de datos particular, no una tabla.
- Haga clic en la pestaña ''Buscar''
- Ingrese el término de búsqueda que desea
- Seleccione las tablas en las que desea buscar
Captura de pantalla de phpMyAdmin :
La función ''Buscar'' también está disponible en MySQL Workbench :
- Menú de la base de datos> Buscar datos de tabla
- Seleccione la base de datos y las tablas que desea buscar (buscará solo en las tablas seleccionadas)
- 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
Escribí un programa de ruby para atravesar un mysql db para una cadena dada pasada como una cla. No hay GUI solo la versión CLI.
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 :)
Estaba buscando lo mismo pero no pude encontrarlo, así que escribí un pequeño script en PHP, puedes encontrarlo en: http://tequilaphp.wordpress.com/2010/07/05/searching-strings-in-a-database-and-files/
¡Buena suerte! (Elimino algún código privado, avíseme si no lo rompí en el proceso: D)
Los primeros 30 segundos de este video muestran cómo usar la función de búsqueda global de Phpmyadmin y funciona. buscará en cada tabla una cadena.
http://www.vodahost.com/vodatalk/phpmyadmin-setup/62422-search-database-phpmyadmin.html
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.