2016-08-29 11 views
2

私のシステムはスペイン語のデータを扱います。私はlaravel + mysqlを使用しています。私のデータベースの照合順序はlatin1のです - デフォルトの照合と私のテーブルの構造は次のようになります。私は、ファイルからDBにデータをロードするPHP + MySQL +スペイン語

  1. 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; 
    

    は、いくつかの質問を持っています。 dbに挿入する前に、 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する必要がありますか?すなわち、選択...名前= utf8_encoded(名前)?

  3. 上記の処理に欠陥や改善策がありますか?私が初めてスペイン語をやっているとき(アクセント付きの文字)。

+0

MySQLのVARCHARはデフォルトで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列の定義された文字セットを変更することを意味します。その後、テキスト文字列を保存する前にユニコードに変換することができます。

各テーブルのデフォルトの照合順序を同じにすることをお勧めします。utf8mb4_spanish_ci照合順序はvarchar()列の索引に焼き付けられます。 (chが別名である伝統的なスペイン語で作業している場合は、utf8mb4_spanish2_ciを使用してください)

関連する問題