Php 对于相同的值,等于的Mysql字符串检查为false

Php 对于相同的值,等于的Mysql字符串检查为false,php,mysql,strlen,Php,Mysql,Strlen,我对MySql有一个问题 我有一个从网站解析信息表。出现一个奇怪的字符串解释: 询问 select id, address from pagesjaunes_test where address = substr(address,1,length(address)-1) 返回一组值,而不是“无” 开始时,我执行了以下功能: address = replace(address, '\n', '') address = replace(address, '\t', '') address = re

我对MySql有一个问题 我有一个从网站解析信息表。出现一个奇怪的字符串解释:

询问

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”的值有一些法文字符,但查询返回的值也只包含英文字符

另一个测试:我试着检查字符串的长度,然后。。。PHP中的strlen()和MYSQL中的LENGTH()显示不同的结果!某个地方的差异是2个字符,某个地方是1个字符,没有特定的“规则”

视觉上我看不到任何空间、标签或其他东西

在我手动修改了一个地址后(我删除了所有字符串并再次写入),问题就解决了,但我有大约6000个值,所以这不是一个解决方案:)

有什么问题吗

我想字符串可以有“空字符”这样的内容,但是如何检测和删除它呢

谢谢

附言。
问题不仅仅是长度。我需要将这个表与另一个表连接起来,并使用一个条件来检查字段“address”中的值是否相等。即使字段具有相同的排序规则,而表具有相同的排序规则,查询也会返回不匹配的地址

例如

查询:

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地址=r、 地址

结果是:

+-------------------------------------+------------------------+--------------------------+------------------------+ | address | char_length(p.address) | address | char_length(r.address) | +-------------------------------------+------------------------+--------------------------+------------------------+ | Dupin Marc13 quai Grands Augustins | 34 | 13 quai Grands Augustins | 24 | | 39 r Montpensier | 16 | 39 r Montpensier | 16 | | 8 r Lord Byron | 14 | 3 r Balzac | 10 | | 162 r Vaugirard | 15 | 162 r Vaugirard | 15 | | 32 r Goutte d'Or | 16 | 32 r Goutte d'Or | 16 | | 2 r Casimir Périer | 18 | 2 r Casimir Périer | 18 | | 20 r Saussier Leroy | 19 | 20 r Saussier Leroy | 19 | | Senes Douglas22 r Greneta | 25 | 22 r Greneta | 12 | | Ngov Ly Mey44 r Tolbiac | 23 | 44 r Tolbiac | 12 | | 33 r N-D de Nazareth | 20 | 33 r N-D de Nazareth | 20 | +-------------------------------------+------------------------+--------------------------+------------------------+ +-------------------------------------+------------------------+--------------------------+------------------------+ |地址|字符长度(p.address)|地址|字符长度(r.address)| +-------------------------------------+------------------------+--------------------------+------------------------+ |杜平3月13日大奥古斯丁码头34日| 13大奥古斯丁码头24日| |39 r Montpusier | 16 | 39 r Montpusier | 16| |8 r拜伦勋爵14 r巴尔扎克10| |162 r沃吉拉德| 15 | 162 r沃吉拉德| 15| |32 r Goutte d'Or | 16 | 32 r Goutte d'Or | 16| |2 r Casimir Périer | 18 | 2 r Casimir Périer | 18| |20 r Saussier Leroy | 19 | 20 r Saussier Leroy | 19| |女总管道格拉斯22 r格雷内塔| 25 | 22 r格雷内塔| 12| |Ngov Ly Mey44 r Tolbiac | 23 | 44 r Tolbiac | 12| |33 r N-D de Nazareth | 20 | 33 r N-D de Nazareth | 20| +-------------------------------------+------------------------+--------------------------+------------------------+
如您所见,“162R Vaugirard”、“20R Saussier Leroy”只包含ASCII字符,长度相同,但不相等

也许可以看看mysql文本字段的编码——UTF8用2个字节编码其大部分字符——只有一小部分UTF8(例如ASCII字符)用一个字节编码

MySQL知道UTF8并正确计数。 PHP文本函数不支持UTF8,并自行计算字节数

因此,如果PHP比MYSQL更重要,这可能就是原因,您可以看看utf8decode


来自萨尔茨堡的比尔

也许可以看看mysql文本字段的编码——UTF8用2个字节编码其大部分字符——只有一小部分UTF8(例如ASCII字符)用一个字节编码

MySQL知道UTF8并正确计数。 PHP文本函数不支持UTF8,并自行计算字节数

因此,如果PHP比MYSQL更重要,这可能就是原因,您可以看看utf8decode

来自萨尔茨堡的比尔

报告说:

返回字符串str的长度,以字节为单位。多字节字符计为多个字节。这意味着对于包含五个双字节字符的字符串,LENGTH()返回10,而CHAR_LENGTH()返回5

因此,请改用:)

报告说:

返回字符串str的长度,以字节为单位。多字节字符计为多个字节。这意味着对于包含五个双字节字符的字符串,LENGTH()返回10,而CHAR_LENGTH()返回5

因此,请改用:)


最后,我发现了问题所在。将排序规则更改为ascii_general_ci后,所有非ascii字符都转换为“?”。某些空格也被替换为“?”。检查初始值后,MySQL中的函数ORD()为这些空间返回160(而不是32)。所以

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

解决了我的问题。

最后,我找到了问题。将排序规则更改为ascii_general_ci后,所有非ascii字符都转换为“?”。某些空格也被替换为“?”。检查初始值后,MySQL中的函数ORD()为这些空间返回160(而不是32)。所以

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

解决了我的问题。

问题不仅仅是长度。我需要将这个表与另一个表连接起来,并使用一个条件来检查字段“address”中的值是否相等。即使字段具有相同的排序规则,而表具有相同的排序规则,查询返回的不匹配问题也不仅仅是长度。我需要将这个表与另一个表连接起来,并使用一个条件来检查字段“address”中的值是否相等。即使字段具有相同的排序规则,而表具有相同的排序规则,查询也会返回不寻址的结果。是的,这是正确的函数,但这仍然没有解决我所有的问题。是的,这是正确的功能,但这仍然没有解决我所有的问题