Mysql

使用二進制值更新欄位時出錯

  • February 17, 2022

遷移到新數據庫伺服器後,我在網頁上顯示的表情符號出現問題。但我有一個解決方法。我將在我們的 OLD DB 伺服器上獲取 TABLE1 的某個欄位的二進制值。然後使用以下腳本更新新伺服器上的 TABLE1:

UPDATE old_table t1 INNER JOIN new_table t2 ON t1.id = t2.id
SET t2.message = CAST(CONCAT("0x",HEX(t1.message)) AS BINARY);

但執行此操作後,我在新表上的消息欄位變為“0x1E395565”

如果我在下面執行此腳本,它將顯示真實的消息。但是對一百萬條記錄執行此操作需要很長時間才能執行,因此 UPDATE INNER JOIN:

UPDATE new_table SET message = 0x1E395565 where id =1;

如何正確更新?我在 HEX(t1.message) 上連接“0x”,因為當我執行 mysqldump –hex-blob 和 charset=BINARY 時。值上有 0x。

我的消息欄位的數據類型是 VARCHAR(1000) 我知道這可能是錯誤的,但是在不更改表的情況下是否有任何解決方法。

只需使用UNHEX("1E395565").

可能還有很多其他問題正在發生。所以請提供SHOW CREATE TABLE舊表和新表。還提供舊表中的樣本,但使用

SELECT col, HEX(col) FROM ... WHERE ...

所以我們可以以明確的方式看到價值。(也就是說,沒有被客戶破壞或“修復”。)

1E395565 來自哪裡?我承認它沒有任何意義(不是 utf8 等)。

這就是我所做的對我有用的事情。

在我的舊數據庫伺服器上(在我遷移之前顯示表情符號),因為我只需要輸入表情符號的欄位和行的主鍵,我創建了另一個表,其中只有 2 個欄位包含文本和主鍵. 然後用舊表中的數據填充它。

之後,我使用 –hex-blob 和 charset=BINARY 選項執行 mysqldump。

在我的新數據庫伺服器上,我恢復了轉儲文件。

然後我只是用轉儲中的值更新目前表上的值。

UPDATE prod.emoji as t1
INNER JOIN testdump.emoji_bin as t2 on t1.id = t2.id
SET t1.message = BINARY(t2.message)

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