2016-08-29 136 views
2

我的系統處理西班牙語數據。我正在使用laravel + mysql。我的數據庫歸類爲LATIN1 - 默認排序規則和我的表結構看起來是這樣的:PHP + MySQL +西班牙語

CREATE TABLE `product` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) CHARACTER SET latin1 NOT NULL, 
) ENGINE=InnoDB AUTO_INCREMENT=298 DEFAULT CHARSET=utf8mb4; 

有幾個問題:

  1. 我從文件加載數據到數據庫中。插入到數據庫之前, utf8_encode($ name)是否是一個好習慣?目前我正在這樣做,否則 一些比較拋出錯誤:SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_unicode_ci,COERCIBLE) for operation '='

  2. 如果使用函數utf8_encode是要走的路,我是否需要函數utf8_encode連名字我要搜索?即select ... where name = utf8_encoded(name)?

  3. 是否有任何缺陷或更好的方式來處理上述?當我第一次做西班牙語(帶有口音的字符)時。

+0

我的印象是'VARCHAR's在MySQL是UTF8默認情況下,這樣你就不會想到要使用'utf8_encode'時使用它們。 –

+0

@MartinParkin更新了我在插入數據時沒有使用utf8編碼的錯誤。然後選擇使用=過濾器。 – aiiwa

回答

0

product.name列具有字符集latin1。你懂的。它也有整理latin1_swedish_ci。這是默認設置。 MySQL的原始開發人員是瑞典人。由於您使用的是西班牙語,因此您可能需要使用latin1_spanish_ci進行整理;它在N之後排序Ñ。其他拉丁語整理將它們整理在一起。

因爲你product.name列存儲latin1的,這是一個不好的,不是一個好,建議將其存儲到該列前文本使用utf8_encode()

如果您的應用程序是新的,您的最佳行動方案是爲所有列utf8mb4設置字符集。這意味着更改name列的已定義字符集。然後,您可以在存儲它們之前將文本字符串轉換爲unicode。

你可能會明智地做出每個表utf8mb4_spanish_ci的默認排序。排序規則會烘焙到varchar()列的索引中。 (如果你在傳統的西班牙,其中ch是一個獨特的字母下工作,使用utf8mb4_spanish2_ci。)