我有一个问题:
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 | | |.....
最佳答案
问题是 OP 的字符串附加了一个空格。
SELECT 'foo bar' = 'foo bar '
在 MySQL 中忽略尾随空格,这就是它仍然出现在 OPs 结果中的原因。
您可以使用 SELECT HEX(column)
检查空白间距,在 OP 的情况下给出“3730333434323030383220
”。每个字符都被转换为两个字节(字符的 ASCII 值的十六进制表示,即 0-255),如果我们查看末尾,我们可以看到一个 20,它等于到十进制的“32
”,又名。 a space character .
解决方案(按照“最有意义”的顺序):
- 将数据类型更改为
BIGINT
(与 16 字节相比,它也只需要8
字节)。UNSIGNED
在这里效果最好,支持的电话号码最大为18446744073709551615
- 删除空格:
UPDATE table SET number = TRIM(number)
- 同时使用
RTRIM
:SELECT CHAR_LENGTH(RTRIM(number))
- 在 PHP 中使用
strlen(trim())
关于mysql char_length 返回不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19592291/