mysql char_length返回不正确的结果

时间:2013-10-25 14:16:14

标签: mysql

我有一个问题:

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

结果是:

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

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

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

1 个答案:

答案 0 :(得分:2)

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

MySQL中的

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

您可以使用SELECT HEX(column)检查白色间距,其中OP的情况为“3730333434323030383220”。每个字符都被转换为两个字节(字符的ASCII值的十六进制表示为0-255),如果我们看到结尾,我们可以在那里看到 20 ,这是相等的到十进制的“32”,又名。 a space character

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

  • 将数据类型更改为BIGINT(与16相比,只需8个字节。 UNSIGNED会在这里发挥最佳效果,并支持最多18446744073709551615
  • 的电话号码
  • 删除空格:UPDATE table SET number = TRIM(number)
  • 同时使用RTRIMSELECT CHAR_LENGTH(RTRIM(number))
  • 在PHP中使用strlen(trim())