mysql char_length 返回不正确的结果

标签 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 |            |       |.....

最佳答案

问题是 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/

相关文章:

php - 使用 SQL 转储将 500MB .db 文件导入 phpmyadmin

mysql - 存储过程 CONCAT() 错误代码 1054,未知列

mysql - 如何获得即将到来的周日约会?

mysql - 在 MySql 中快速搜索邮政编码

SQL - 使用查询查找包含 2 个或更多项目的事务

mysql - 我的触发器语句出错

c# - mysql存储过程

mysql - 5 年后,mySQL innoDB 表中有几行消失了

php - 加载数据到文件时 id 自动递增

php - 没有连接的多字节的mysql_real_escape_string?