1

我有一个查询:

 select number,char_length(number) from all_numbers where char_length(number)!=10 and number='7034420082';

结果是:

 +-------------+---------------------+
 | number      | char_length(number) |
 +-------------+---------------------+
 | 7034420082  |                  11 | 
 +-------------+---------------------+

这怎么可能?number 显然是 10 个字符。我已经确认数字的两边都没有空格。

 mysql> explain all_numbers;
 +--------------------+-------------+------+-----+------------+-------+
 | Field              | Type        | Null | Key | Default    | Extra |
 +--------------------+-------------+------+-----+------------+-------+
 | number             | varchar(16) | NO   | PRI |            |       |.....
4

1 回答 1

2

问题是 OP 的字符串附加了一个空格。

SELECT 'foo bar' = 'foo bar '在 MySQL 中忽略尾随空格,这就是为什么它仍然出现在 OPs 结果中。

您可以通过使用SELECT HEX(column)which 在 OP 的情况下给出“ 3730333434323030383220”来检查白色间距。每个字符都被转换为两个字节(字符的 ASCII 值的十六进制表示,即 0-255),如果我们查看末尾,我们可以看到那里有一个20,它等于32十进制中的“”,又名. 一个空格字符

解决方案(按“最有意义”的顺序):

  • 将数据类型更改为(与 16 相比BIGINT也只需要字节)。在这里工作得最好,并支持电话号码8UNSIGNED18446744073709551615
  • 删除空格:UPDATE table SET number = TRIM(number)
  • 也可以使用RTRIMSELECT CHAR_LENGTH(RTRIM(number))
  • strlen(trim())在 PHP 中使用
于 2013-10-25T14:48:16.523 回答