2012-03-01 7 views
3

私はUTF-8文字のデータベースを持っていますが、これは正しく表示されていません。 UNHEX(HEX(column)) != columnの条件を使用して、どのフィールドにUTF-8文字があるかを知ることができたと考えました。結果はかなり面白いです:MySQL - UNHEX(HEX(UTF-8))の問題

id  | content | HEX(content) | UNHEX(HEX(content)) LIKE '%c299%' | UNHEX(HEX(content)) LIKE '%FFF%' | UNHEX(HEX(content)) 
49829102 |   | C299   | 0         | 0        | c299 
874625485 | FFF  | 464646  | 0         | 1        | FFF 

これはどうやって可能ですか、この文字を含む行をどうやって見つけることができますか?

- 編集(2):私の編集が削除されているので(おそらくJamWafflesが私の美しいデータテーブルを修正していたとき)、ここで再びそうです:エディタがUTF-8文字を取り除くと、

- 編集(3):実際にはUNHEX(HEX(content))の表現が間違っています。私のマルチバイト文字を表示するには、次のようにしなければなりませんでした。 SELECT UNHEX(SUBSTR(HEX(content),1)))。悲しいことに、UNHEX(C299)はUNHEX(C2)+ UNHEX(99)として機能しないので、作図委員会に戻ってきます。

+0

ので、我々はスキーマを参照することができ、あなたのテーブルのためのTABLE'をCREATE SHOW 'の結果を投稿してくださいを参照してください。また、結果を得るために実行した完全なクエリを投稿してください。 –

+0

@Ikeウォーカー確か: テーブル: ''コンテンツ\ '\'テーブル\ '(' int型(11 \ ID '\ )NOT NULL AUTO_INCREMENT、 \ CREATE TABLEをNOT NULLとLONGTEXT、 PRIMARY KEY(\' ID \\) )ENGINE = MyISAM AUTO_INCREMENT = 874625486 DEFAULT CHARSET = utf8' クエリ: 'SELECT id、content、HEX(content)、UNHEX(HEX(content))LIKE '%c299%'、UNHEX(HEX(content )) '%FFF%'、UNHEX(HEX(内容))と同様に\ 'テーブル\" – eithed

答えて

1

文字列にUTF-8固有の文字が含まれているかどうかを判断するには、2通りの方法があります。第二は、バイナリと文字の長さを比較することである

SELECT _utf8 'amńbcd' REGEXP '[^[.NUL.]-[.DEL.]]'; 

:最初の文字列がASCII文字セット外の値持っているかどうかを確認することである

SELECT LENGTH(_utf8 'amńbcd') <> CHAR_LENGTH(_utf8 'amńbcd'); 

両方をTRUEを返します。

http://sqlfiddle.com/#!2/d41d8/9811