2011-12-24 5 views
0

残念ながら私はテーブルを切り捨てました。バックアップをインポートするときに、VARBINARY(24)タイプの行でいくつか問題がありました。Mysql varbinary型の行と無効な文字

どうしたのですか?

私はこのようになり、私のフィールドをしたい:私は次のクエリを使用していたときにŔÎĹͳ׼ųÎ070905-121713

しかし:

UPDATE `proto` 
SET `vname` = 'ŔÎĹͳ׼ųÎ070905-121713 ' 
WHERE `id` = 127; 

をクエリがエラーなしで実行されているが、その後、私は実行します。

SELECT `vname` 
FROM `proto` 
WHERE `id` = 127; 

そして私は私のvnameフィールドは次のようなデータがあることを参照してください。

c594c38ec4b9c38dc582c397c4bdc4b9c582c38e30373039

代わりの

ŔÎĹͳ׼ųÎ070905-121713

何が問題なのですか、フィールドデータをŔÎĹͳ׼ųÎ070905-121713に設定できないのはなぜですか?

答えて

1

バイナリデータを一連の文字として渡すと、エンコードの問題が発生することがあります。あなたが "ŔÎĹͳ׼ųÎ070905-121713"を送信するとき、サーバーはバイナリデータを意味するかを把握しなければなりません。これは、接続に選択されたエンコーディングによって異なります。正しいかどうかを確認してください。

一般に、バイナリデータを(x'123AB45CD789EF'のように)16進数で渡すことをお勧めしますが、理解している限り、データは文字で表されるテーブルバックアップを既に持っています。あなたのために。

+0

接続のエンコードを確認するにはどうすればよいですか? – Cyclone

+0

これは、サーバーとの通信に使用するツールによって異なります...これは、接続を確立するときにパラメータの1つにする必要があります。 –

+0

ところで、サーバー/データベース/テーブルのエンコーディングをデータのエンコーディングと一致するようにチェックすることもできます。 –

2

文字列はユニコード文字列です。 1文字に複数のバイトを使用できるutf-8エンコードでエンコードされます。だから、あなたの文字列は、以下に対応する配列をバイト:

C5 94 C3 8E C4 B9 C3 8D C5 82 C3 97 C4 BD C4 B9 C5 82 C3 8E 30 37 30 39 30 35 2D 31 32 31 37 31 33

カラムがVARBINARY(24)として宣言されているため、データがカラムに収まらず、切り捨てられます。唯一の24バイトが格納されています

C5 94 C3、C4 8E B9 C3 8D C5 82 C3 97 C4 BD C4、C5、B9 82 C3 8E 30 37 30 39

あなたが見るものであること。

問題を解決するには、列の型をVARCHAR(24)に設定します。これにより、制限はバイト数ではなく文字数に適用されます。テーブルのエンコーディングを "utf-8"に設定します。接続エンコーディングを設定できる場合は、それも "utf-8"とします(既に "utf-8"のように見えます)。その後、すべてがOKになります。

カラムVARCHARを作成したくない場合は、VARBINARYの容量を2倍にすることができます。それを変化させる(48)。しかし、私はこれをお勧めしません。ほとんどの24文字のutf-8でエンコードされた文字列は48バイトに収まるでしょうが、いくつかのエキゾチックな文字は2バイト以上を取ることができるためです(理論的には、utf-8の1文字の長さは6バイト!非常にまれにしかし...)。 VARCHARの列を作成すると、実際にバイナリデータではなくテキストが配置されるため、これが最適なオプションになります。

+0

Aight、ありがとう!私は明日それを試してみましょう。メリークリスマス! (今は+1)。 – Cyclone

+0

まあ、私はphpMyAdminを使用しています。テーブルのエンコーディングを 'utf-8_general_ci'に設定しましたが、次のクエリを実行している間も問題は発生します:' UPDATE items SET name = 'ŔÎĹͳ׼ųÎ070905-121713'; '。私はこの警告を受け取ります: 'Warning:#1265行1の' name '列のデータが切り捨てられ、 'name'フィールドが' c594c38ec4b9c38dc582c397c4bdc4b9c582c38e30373039'のようになりました。 (次のコメントを読む)。 – Cyclone

+0

私はアドバイスしたように、VARBINARY列フォームのタイプをVARCHARに変更しましたか? –