Php 对于相同的值,等于的Mysql字符串检查为false
我对MySql有一个问题 我有一个从网站解析信息表。出现一个奇怪的字符串解释: 询问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
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”中的值是否相等。即使字段具有相同的排序规则,而表具有相同的排序规则,查询也会返回不寻址的结果。是的,这是正确的函数,但这仍然没有解决我所有的问题。是的,这是正确的功能,但这仍然没有解决我所有的问题