วิธีค้นหาฐานข้อมูล MySQL ทั้งหมดสำหรับสตริงที่ต้องการ


19

เป็นไปได้หรือไม่ที่จะค้นหาตารางฐานข้อมูลทั้งหมด (แถวและคอลัมน์) เพื่อค้นหาสตริงเฉพาะ

ฉันมีฐานข้อมูลชื่อ A ที่มีตารางประมาณ 35 ตารางฉันจำเป็นต้องค้นหาสตริงที่ชื่อ "hello" และฉันไม่รู้ว่าบันทึกสตริงนี้ในตารางใดได้หรือไม่

ใช้งาน MySQL

ฉันเป็นผู้ดูแลระบบลินุกซ์และฉันไม่คุ้นเคยกับฐานข้อมูลมันจะเป็นประโยชน์จริง ๆ ถ้าคุณสามารถอธิบายแบบสอบถามด้วย


คำตอบ:



7

ย้อนกลับไปในกรกฎาคม 2012 ฉันเขียนโพสต์นี้

ค้นหาเพื่อค้นหาและแทนที่ข้อความในตารางและฟิลด์ทั้งหมดของ mysql db

จะใช้ตารางINFORMATION_SCHEMA.COLUMNSที่จะรับทุก CHAR, VARCHAR และข้อมูลข้อความและดำเนินการเกี่ยวกับใจแทนที่

โปรดดูลิงค์เก่าของฉันและใช้กระบวนทัศน์เพื่อทำการค้นหา

ตัวอย่างนี้จะสร้าง SELECT แยกต่างหากสำหรับแต่ละคอลัมน์ข้อความในทุกตาราง

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;

สร้างไฟล์ข้อความ Giant SQL ด้วย จากนั้นดำเนินการสคริปต์ Giant 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

เอาต์พุตแจ้งให้คุณทราบถึงฐานข้อมูลตารางและคอลัมน์ที่ข้อมูลปรากฏขึ้น

ให้มันลอง !!!.

แก้ไข:

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

ควร: เพิ่มขีดหลังสองอันที่แสดงด้านล่างสำหรับตารางที่มีช่องว่างในชื่อ

db,'.`',tb,'`',' WHERE

วิธีนี้ใช้ได้ดีมาก! จำเป็นหรือไม่ที่จะต้องทำการคัดลอกเคียวรีเริ่มต้นไปยังบรรทัดตัวแปรสภาพแวดล้อมด้วยตนเอง? ฉันสามารถวางและเรียกใช้แบบสอบถามภายในเซสชัน mysql แต่แน่นอนว่ามันเป็นไปได้ที่จะวางแบบสอบถามนั้นลงในไฟล์
John T

@JohnT II ทำทีละบรรทัดเพื่อหลีกเลี่ยงการเลื่อนคำตอบของฉันในแนวตั้ง คุณสามารถทำได้ทุกวิธีที่ง่ายที่สุด
RolandoMySQLDBA

2

ด้วยวิธีการอื่นที่ไม่จำเป็นต้องสร้างแบบสอบถาม SQL ฉันได้พัฒนาCRGREPเป็นเครื่องมือบรรทัดคำสั่ง opensource ฟรีที่จะ grep ฐานข้อมูล (รวมถึง MySQL) และสนับสนุนประเภท "fred customer.name" ที่ง่าย ๆ ทั้งสองค้นหาคำว่า "fred" ในชื่อ "คอลัมน์ของตาราง" ลูกค้า "ไปยังการจับคู่รูปแบบที่ซับซ้อนยิ่งขึ้นเช่น" fr? d * .author "สำหรับการจับคู่รูปแบบกับคอลัมน์" ผู้เขียน "ทั้งหมดในตารางทั้งหมด


2

คุณสามารถกลับคอลัมน์ทั้งหมดจากตารางทั้งหมดที่ตรงกับค่าใด ๆ ที่คุณกำลังมองหาทั้งหมดในครั้งเดียวโดยการสร้างออกจากคำตอบของ RolandoMySQLDBAและการใช้PREPAREและEXECUTEการเรียกใช้แบบสอบถาม

-- 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;

1

หากคุณสามารถใช้ bash - นี่คือสคริปต์: มันต้องการผู้ใช้ dbread ด้วย pass dbread บนฐานข้อมูล

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

หากใครต้องการคำอธิบาย: http://infofreund.de/?p=1670


1

หากคุณเป็นผู้ดูแลระบบ Linux คุณควรคุ้นเคยกับบรรทัดคำสั่งดังนั้นสิ่งนี้จะเป็นประโยชน์:

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

เปลี่ยนroot/ rootเป็นข้อมูลประจำตัว mysql ของคุณ (หรือใช้~/.my.cnf) db_nameเป็นชื่อฐานข้อมูลของคุณและfooสำหรับข้อความค้นหาของคุณ พารามิเตอร์--skip-extended-insertสำหรับmysqldumpจะแสดงแต่ละแบบสอบถามในบรรทัดแยกกัน พารามิเตอร์--color=autoสำหรับgrepจะเน้นสตริงของคุณและ-wจะจับคู่ทั้งคำ


0

คุณมีสิทธิ์เข้าถึง phpMyAdmin หรือไม่ มันมีคุณสมบัติการค้นหาสำหรับแต่ละฐานข้อมูล

หรือใช้การเขียนสคริปต์ที่คุณเลือกจากผลลัพธ์ของ (เปลี่ยน 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

ฉันมุ่งเน้นโซลูชันเทมเพลตอย่างง่ายสำหรับคำถามของคุณที่นำมาใช้ในplsql สำหรับ Oracleฐานข้อมูลฉันหวังว่าจะปรับแต่งมันใน MySql ซึ่งเป็น googleing แบบง่าย สิ่งที่คุณต้องมีก็คือการตรวจสอบโครงสร้างข้อมูลบน MySql และแทนที่ชื่อตารางและคอลัมน์บางส่วน

ในสคริปต์: ALL_TAB_COLUMNSเป็นตารางสคีมาข้อมูลที่มีคอลัมน์ตารางทั้งหมด 'VARCHAR2', 'NVARCHAR2', 'NCHAR', 'CHAR'อ้างถึงประเภทคอลัมน์สตริงใน Oracle คุณต้องแทนที่ด้วยชื่อประเภทเทียบเท่าของ MySql
% hello% คือคำค้นหาแทนที่ด้วยสตริงใด ๆ

ผลลัพธ์จะเป็นสคริปต์ sql บางส่วนหรือหลายสคริปต์ (ขึ้นอยู่กับประเภทคอลัมน์ตารางของคุณ) และการเรียกใช้สคริปต์เหล่านี้จะส่งผลให้คำตอบของคุณ
นอกจากนี้ประสิทธิภาพและเวลาที่ใช้จะเป็นอีกเรื่องหนึ่ง
ฉันหวังว่านี่จะเป็นประโยชน์

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

มีห้องสมุดที่ดีสำหรับการอ่านตารางทั้งหมด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

ใช้เคล็ดลับนี้กับหนึ่งบรรทัดของรหัส

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

column_name: พิมพ์ชื่อคอลัมน์ทั้งหมดที่คุณค้นหา

table_name: พิมพ์ชื่อตารางทั้งหมดที่คุณค้นหา


สิ่งนี้อาจใช้งานได้จริงในฐานข้อมูลขนาดเล็กมาก - น้อยดังนั้นหากคุณพยายามค้นหาค่าในหลายร้อยตารางและหลายพันคอลัมน์ จากฐานข้อมูลถ้อยคำ "ฐานข้อมูลทั้งหมด" ในคำถามเดิมฉันสมมติว่าสิ่งนี้ควรจัดการกับตารางทั้งหมดในฐานข้อมูล
RDFozz

0

หากคุณใช้งาน MySQL Workbench ให้คลิกขวาที่สคีมาฐานข้อมูลและเลือก "ค้นหาข้อมูลตาราง ... " จากนั้นกรอกแบบฟอร์ม นี่จะค้นหาฐานข้อมูลทั้งหมด เมื่อผลลัพธ์ (หรือถ้า) ปรากฏขึ้นให้คลิกที่ลูกศรเพื่อขยาย มันจะแสดงสคีมาตารางข้อมูลคีย์หลักชื่อคอลัมน์และข้อมูลจริงที่ตรงกับการค้นหาของคุณ
เคล็ดลับ: หากไม่มีอะไรเกิดขึ้นลองขยายการค้นหาของคุณ
โปรดทราบว่านี้เป็นเพียงประโยชน์จริงๆสำหรับการค้นหาข้อความ ( char, varcharและtext) ชนิดข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.