【问题标题】:MySQL's LIKE operator doesn't find phone number that matches exactlyMySQL 的 LIKE 运算符找不到完全匹配的电话号码
【发布时间】:2017-11-09 11:09:52
【问题描述】:

这是我在这里的第一个问题,MySQL 有一个奇怪的问题: 我在 varchar(50) utf8mb4_unicode_ci 类型的数据库字段“电话”中有电话号码。类型是 varchar,因为数字可以有 / 或 - 等分隔符和用于格式化的空格。

如果我选择电话号码:

SELECT phone, REPLACE(REPLACE(REPLACE(REPLACE(phone,' ',''),'-',''),'/',''),'.','') FROM [table] WHERE id=405760

输出是: 0151 / ‎434 77 588, 0151‎43477588

所以当我选择

但是使用 LIKE 运营商搜索这些电话号码失败了这个特定的电话号码 015143477588(其他工作完美):

SELECT *
FROM [table]
WHERE REPLACE(REPLACE(REPLACE(REPLACE(phone,' ',''),'-',''),'/',''),'.','') like '%015143477588%'

如果我使用 = 而不是 LIKE 它可以工作。

SELECT *
FROM [table]
WHERE REPLACE(REPLACE(REPLACE(REPLACE(phone,' ',''),'-',''),'/',''),'.','') = '015143477588'

如前所述,其他电话号码也可以使用....有什么想法吗?

【问题讨论】:

  • 真的是空格,/和-是数字的一部分,还是它们是数字显示的一部分?我将只存储数字,可能将国家代码存储在单独的列中,因此 + 也可以被过滤掉,并且只有空格等作为 UI 的一部分。如果您需要将其与所有格式选项一起存储,请使用不同的列来存储净号并始终查询净号
  • 第一个问题做得很好。欢迎来到堆栈溢出。但是[table] 语法是什么?这就是 SQL Server 的说法。
  • 看到 4 个嵌套的 REPLACE 函数我真的怀疑你在电话列中的数据。你应该真正修复你的格式并创建一个触发器来强制执行电话格式。
  • 在替换之前修剪电话号码可能会起作用,因为我根据您的要求进行了测试,它可以正常工作

标签: mysql sql-like


【解决方案1】:

我已经在我的数据库中检查了您的查询,它工作正常

SELECT * FROM users WHERE REPLACE( REPLACE( REPLACE( REPLACE( phone, ' ', '' ) , '-', '' ) , '/', '' ) , '.', '' ) LIKE '%015143477588%'

您可以在将Collation 从utf8mb4_unicode_ci 更改为utf8_swedish_ci 后查看您的查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2013-05-21
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多