0

MySql に問題があります。Web サイトから解析された情報を含むテーブルがあります。奇妙な文字列解釈が表示されます。

クエリ

select id, address from pagesjaunes_test where address = substr(address,1,length(address)-1)

なしの代わりに一連の値を返す

最初は次のように関数を実行しました:

address = replace(address, '\n', '')
address = replace(address, '\t', '')
address = replace(address, '\r', '')
address = replace(address, '\r\n', '')
address = trim(address)

しかし、問題はまだ解決していません。

フィールド 'address' の値にはいくつかのフランス語の文字が含まれていますが、クエリは英数字の英語の文字のみを含む値も返しました。

もう 1 つのテスト: 文字列の長さを確認しようとしましたが、PHP の strlen() と MYSQL の LENGTH() は異なる結果を表示します! 特定の「ルール」がなくても、どこかで 2 文字、どこかで 1 文字の違いがあります。

ビジュアル スペースもタブも何も見えません。

アドレスを手動で変更した後 (すべての文字列を削除して、もう一度書き直しました)、問題は解決しましたが、値が ~ 6000 あるため、これは解決策ではありません :)

何が問題になる可能性がありますか?

文字列には「空の文字」が含まれている可能性があると思いますが、それを検出して削除するにはどうすればよいですか?

ありがとう

PS 問題は長さだけではありません。このテーブルを他のテーブルと結合し、フィールド「住所」の値が等しいかどうかを確認する条件を使用する必要があります。フィールドの照合順序が同じで、テーブルの照合順序が同じ場合でも、クエリは一致するアドレスがないことを返します

例えば

クエリの場合:

SELECT p.address,char_length(p.address) , r.address, char_length(r.address) 
FROM `pagesjaunes_test` p
LEFT JOIN restaurants r on p.name=r.name
WHERE  
p.postal_code=r.postal_code 
and p.address!=r.address
and p.phone='' 
and p.cuisines=''
LIMIT 10

つまり: p.address!=r.address

結果は次のとおりです。

+-------------------------------------+----------------------- ---+--------------------------+--------- ---------------+
| | 住所 | char_length(p.address) | 住所 | char_length(r.address) |
+-------------------------------------+----------------------- ---+--------------------------+--------- ---------------+
| | デュパン マルク 13 ケ グラン オーギュスタン | 34 | 13 ケ グラン オーギュスタン | 24 |
| | 39 r モンパンシエ | 16 | 39 r モンパンシエ | 16 |
| | 8 r バイロン卿 | 14 | 3 r バルザック | 10 |
| | 162 r ヴォージラール | 15 | 162 r ヴォージラール | 15 |
| | 32 r グット ドール | 16 | 32 r グット ドール | 16 |
| | 2 r カシミール・ペリエ | 18 | 2 r カシミール・ペリエ | 18 |
| | 20 r ソシエールロワ | 19 | 20 r ソシエールロワ | 19 |
| | Senes Douglas22 r グレネータ | 25 | 22 r グレネタ | 12 |
| | Ngov Ly Mey44 r トルビアック | 23 | 44 r トルビアック | 12 |
| | 33 r ND デ ナザレ | 20 | 33 r ND デ ナザレ | 20 |
+-------------------------------------+----------------------- ---+--------------------------+--------- ---------------+

ご覧のとおり、「162 r Vaugirard」、「20 r Saussier Leroy」には ASCII 文字のみが含まれており、長さは同じですが、等しくありません!

4

3 に答える 3

3

たぶん、mysql テキスト フィールドのエンコーディングを見てください - UTF8 はその文字のほとんどを 2 バイトでエンコードします - UTF8 の小さなサブセット (ASCII 文字など) だけが 1 バイトでエンコードされます。

MySQL は UTF8 を認識し、正しくカウントします。PHP テキスト関数は UTF8 を認識せず、バイト自体をカウントします。

したがって、PHP が MYSQL よりも多くカウントする場合は、おそらくこれが原因であり、utf8decode を確認できます。

ザルツブルグから!

于 2012-04-13T07:57:27.133 に答える
1

公式ドキュメントには次のように書かれています。

文字列strの長さをバイト単位で返します。マルチバイト文字は複数バイトとしてカウントされます。これは、5つの2バイト文字を含む文字列の場合、LENGTH()は10を返し、CHAR_LENGTH()は5を返すことを意味します。

したがって、CHAR_LENGTH代わりに使用してください:)

select id, address from pagesjaunes_test
where address = substr(address, 1, char_length(address) - 1)
于 2012-04-13T08:08:53.353 に答える
0

最後に、私は問題を見つけました。照合をascii_general_ciに変更した後、すべての非ASCII文字は「?」に変換されました。一部のスペースも「?」に置き換えられました。初期値を確認した後、MySQLの関数ORD()は、これらのスペースに対して(32ではなく)160を返しました。それで、

UPDATE pagesjaunes_test SET address = TRIM(REPLACE(REPLACE(address, CHAR(160), ' '), '  ',' ')

私の質問を解決しました。

于 2012-04-17T08:21:50.713 に答える