我有一个问题:
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 | | |.....
答案 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)
RTRIM
:SELECT CHAR_LENGTH(RTRIM(number))
strlen(trim())