Mysql

是否可以執行查詢來定位哪個表包含單列中包含超過 100 萬個字元的行?

  • July 8, 2022

我們有一個包含 701 個表的 MySQL 數據庫。我正在嘗試使用數據管道工具將這個 MySQL 數據庫複製到我們的數據倉庫 Snowflake 中。不幸的是,管道工具遇到錯誤,因為其中一個表中的一條記錄包含單行,單列中包含超過 100 萬個字元。

我試圖找出是否有一個我可以使用的查詢來查看每個表,以確定哪一行有這個違規記錄。這有可能做到嗎?

奇怪的是,管道工具沒有提供更多關於哪個表/列的上下文。

information_schema.COLUMNS包含一個CHARACTER_MAXIMUM_LENGTH並且CHARACTER_MAXIMUM_LENGTH可以指示哪些表列可以儲存 1MB 的數據。

之後,您需要查詢所有可能的表。

如果有更短的方法可以做到這一點,我不知道。

基於@danblack 的答案,您將創建一個可能包含如此長數據的表列表。這可能會返回 701 表的一個子集。即不是所有的表都有一個可以包含這麼長數據的列。

然後用於MAX(CHAR_LENGTH(<column>))獲取該表中任何行的最大長度。每個表需要一個查詢,因為您可以在每個查詢中放置多個聚合表達式。

事實上,您可以使用 INFORMATION_SCHEMA 查詢來格式化您需要的查詢:

SELECT CONCAT(
 'SELECT ',
 GROUP_CONCAT(CONCAT('MAX(CHAR_LENGTH(`',COLUMN_NAME,'`)) AS `MAX_',COLUMN_NAME,'_LENGTH`')),
 ' FROM `',TABLE_SCHEMA,'`.`',TABLE_NAME,'`;') AS _query
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE CHARACTER_MAXIMUM_LENGTH >= 1000000
 AND TABLE_SCHEMA NOT IN ('mysql','sys','performance_schema','information_schema')
GROUP BY TABLE_SCHEMA, TABLE_NAME;

結果是一組字元串,它們本身就是您可以執行的 SQL 查詢,每個表一個。

引用自:https://dba.stackexchange.com/questions/314178