对于相同的值,等于的 Mysql 字符串检查是假的


Mysql string check on equals is false for the same values

我在使用 MySql 时遇到了问题我有一个表格,其中包含来自网站的解析信息。出现了一个奇怪的字符串解释:

查询

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

返回一组值而不是 none

一开始我执行的功能如下:

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

但问题仍然存在。

字段 'address' 的值有一些法语字符,但查询返回的值也只包含 alfanumeric 英语字符。

另一个测试:我试图检查字符串的长度并...PHP 的 strlen() 和 MYSQL 的 LENGTH() 显示不同的结果!某处的差异是 2 个字符,某处是 1 个字符,没有特定的"规则"。

视觉我看不到任何空间或选项卡或其他东西。

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

可能是什么问题?

我想字符串可以有"空字符",但是如何检测和删除它呢?

谢谢

附言问题不仅仅在于长度。我需要将此表与其他表连接,并使用检查字段"地址"中的值是否相等的条件。即使字段具有相同的排序规则,表具有相同的排序规则,查询也会返回没有匹配的地址

例如

对于查询:

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(地址) |地址 |char_length(地址) |+-------------------------------------+------------------------+--------------------------+------------------------+|杜邦马克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 ||塞内斯·道格拉斯22 r 格蕾妮塔 |                    25 |22 r 格蕾妮塔 |                    12 ||恩戈夫·梅44 r 托尔比亚克 |                    23 |44 r 托尔比亚克 |                    12 ||拿撒勒 33 r N-D |                    20 |拿撒勒 33 r N-D |                    20 |+-------------------------------------+------------------------+--------------------------+------------------------+

如您所见,"162 r Vaugirard","20 r Saussier Leroy"仅包含ASCII字符,长度相同但不相等!

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

MySQL知道UTF8并且计数正确。PHP 文本函数不能识别 UTF8,并且会自行计算字节数。

因此,如果PHP比MYSQL重要,这可能是原因,你可以看看utf8decode。

来自萨尔茨堡的BR!

官方文档说:

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

因此,请使用CHAR_LENGTH而不是:)

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

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

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

解决了我的问题。