0

我的 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)

但问题仍然存在。

字段“地址”的值有一些法语字符,但查询返回的值也只包含字母数字英语字符。

另一个测试:我试图检查字符串的长度...... 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) |
+--------------------------------------+------------ ----------+--------------+--------- ---------------+
| Dupin Marc13 quai Grands Augustins | 34 | 13 quai Grands 奥古斯丁 | 24 |
| 39 r 蒙彭西耶 | 16 | 39 r 蒙彭西耶 | 16 |
| 8 r 拜伦勋爵 | 14 | 3 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 |
| Senes Douglas22 r Greneta | 25 | 22 r 格雷内塔 | 12 |
| Ngov Ly Mey44 r Tolbiac | 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字符)用一个字节编码。

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

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

来自萨尔茨堡的兄弟!

于 2012-04-13T07:57:27.133 回答
1

The official documentation says:

Returns the length of the string str, measured in bytes. A multi-byte character counts as multiple bytes. This means that for a string containing five two-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH() returns 5.

So, use CHAR_LENGTH instead :)

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() 为这些空间返回 160(而不是 32)。所以,

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

解决了我的问题。

于 2012-04-17T08:21:50.713 回答