2017-09-12 10 views
0

テストSELECT:私のMySQL DBがlatin1エンコーディングでアラビア文字を正しく保存できるのはなぜですか?

MySQL [chuangwai]> select ar_detail from items limit 1\G; 
*************************** 1. row *************************** 
ar_detail: {"طراز": "فساتين قفطان", "المواد": "الشيفون"} 

、あなたが正しく表示アラビア語の文字を見ることができます。

その後、私はエンコーディングをチェックしてください。別のSO post

MySQL [chuangwai]> select * from information_schema.SCHEMATA\G; 
*************************** 2. row *************************** 
       CATALOG_NAME: def 
       SCHEMA_NAME: chuangwai 
DEFAULT_CHARACTER_SET_NAME: latin1 
    DEFAULT_COLLATION_NAME: latin1_swedish_ci 
        SQL_PATH: NULL 

BalusCは言った:

を使用すると、中国語、日本語、 ヘブライ語、キリル文字、などの非ラテン文字を格納しようとしている場合等Latin1エンコーディングを使用して、彼らは mojibakeとして終了します。

ご覧のとおり、私の場合ではありません。誰も私になぜlatin1エンコーディングでアラビア文字を保存できるのか説明してくれませんか? DBのエンコーディングをlatin1からuft8に切り替える必要がありますか?


EDIT:さて、私はちょうどitemsのエンコーディングがuft8で見つけ...

MySQL [chuangwai]> SELECT TABLE_COLLATION 
    -> FROM INFORMATION_SCHEMA.TABLES 
    -> WHERE TABLE_NAME = 'items'; 
+-----------------+ 
| TABLE_COLLATION | 
+-----------------+ 
| utf8_unicode_ci | 
+-----------------+ 

答えて

1

最も可能性のある説明は、あなたのスキーマがASCIIの場合でも、あなたのテーブルがUTF8であるということです。私の場合は

SELECT TABLE_COLLATION 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME = 'items'; 

を試してみて、UTF8テーブルは私を与える:utf8_general_ciutf8mb4_general_ciが表示されることがあります(さまざまな理由により実際にはutf8_general_ciよりも良い)

ここで、「エンコードを切り替える必要がありますか?答えは「技術的にはいいですが、おそらく良い考えです」エンコーディングをテーブル定義に含める限り、スキーマのエンコーディングを心配する必要はありません。それでも、後で誤ってデータを変更する心配がないように、エンコードを切り替える方がよいでしょう。

1

SHOW CREATE TABLEを入力してください。 テーブルののデフォルト値はですが、カラムのは別のものです。

クライアントにあるバイトがutf8であることをMySQLにアナウンスする必要があります。 (彼らは、これらの文字セットは、問題の文字を持っていないので、は、LATIN1、はるかに少ないアスキーすることはできません。)

あなたはCHARACTER SET utf8(またはutf8mb4)宣言する必要があります。 次にはすべてうまくいくでしょう。

しかし、あなたはlatin1のどこかに行くことができましたか?まあ、それは事故です。

ケース1:クライアントにあるものとテーブルの列に保存するものについては、あなたが嘘をついています。しかしlatin1は許しています。基本的には、意味を無視してバイトを格納します。

ケース2:「二重エンコード」を取得すると、文字が4バイトとして保存されます。しかし、彼らは魔法のように戻ってOKに見える。

ケース3:Mojibakeは、間違ったことをする別の方法です。しかし、テキストがそのまま取り出されるので、私はあなたがこのケースを持っているとは思わない。

ケース...(他のケースがありますが、下記のリンクを参照してください)

いずれの場合においても、ORDER BYWHEREは間違って物事を並べ替えたり、フィルタリングする可能性があります。

「ベストプラクティス」を参照http://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored

関連する問題