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 文字のみが含まれており、長さは同じですが、等しくありません!