2012-03-14 52 views
2

我有一個包含不同語言數據的數據庫。有些語言使用口音(如áéíóú),我需要搜索這些數據,因爲口音不存在(搜索'campeon'應返回'campeón'作爲valir結果)。在有問題的數據庫上對口音進行不敏感搜索

問題是我的數據庫中的表(utf8_unicode_ci)沒有存儲utf8字符。如果通過的phpmyadmin看到的數據與口音的話是這樣的:campeón

一些經過研究,我發現(在StackOverflow question),這個問題關係到一個組名稱的不存在性[charset]。事實上,我做了一些測試,如果我將名稱設置爲utf8,則所有內容都按預期工作。

那麼,我有解決方案,有什麼問題?問題在於數據庫正在生產中,因此數據庫中有數千個字符串。如果我更改客戶端將使用的字符集,則所有已存在的字符串將變爲無效。問題是:有什麼辦法可以:

  1. 在使用像我這樣的錯誤字符集的數據庫中執行不區分重音的搜索?
  2. 將表中的數據安全地轉換爲適當的字符集?
  3. 繼續使用數據庫中的混合字符集(latin1和utf8),假設latin1數據不會不區分重音?

如果任何人有任何解決方案的經驗,我建議或有一個新的,我會非常感謝,如果分享。

+0

您確信phpmyadmin不會屠殺數據嗎?我個人不會相信它...... – sarnold 2012-03-14 09:52:21

+0

我也在命令行上測試過(mysql命令),結果是一樣的 – Ivan 2012-03-14 10:10:07

回答

1

是該數據已插入使用了錯誤的連接編碼的問題,您可以通過

  1. 使用了錯誤的連接編碼導出數據修復它,就像你迄今使用它,其次是
  2. 使用正確的utf8連接編碼導入數據。

這將解決編碼問題,之後搜索將按預期工作。

+0

呃,看起來很容易。當你說'輸出'和'輸入'時,你是在談論phpmyadmin上的導出和導入命令還是關於自定義php代碼段? – Ivan 2012-03-14 10:12:04

+0

phpmyadmin可能是最糟糕的選擇,因爲它自動處理編碼,這就是你不想在這種情況下。一個小的PHP腳本應該這樣做,否則mysqldump或類似的手動查詢。 – deceze 2012-03-14 10:55:04

+0

我在看mysqldump,但找不到任何方式強制導入與我需要的編碼,如何做到這一點? – Ivan 2012-03-14 11:05:12

0

如果您在會話開始時創建表的副本,請更改副本的字符集,執行所有查詢,然後在會話結束時刪除表?我不知道這是多麼實際 - 取決於你需要多久執行一次這些查詢以及表格的大小。

+0

恐怕查詢是必不可少的,這將大大降低性能 – Ivan 2012-03-14 10:13:42

+0

瞭解 - 抱歉,我不能沒有幫助。 – JTeagle 2012-03-14 10:17:15