Mysql
使用二進制值更新欄位時出錯
遷移到新數據庫伺服器後,我在網頁上顯示的表情符號出現問題。但我有一個解決方法。我將在我們的 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)