【发布时间】: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, 015143477588
所以当我选择
但是使用 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 函数我真的怀疑你在电话列中的数据。你应该真正修复你的格式并创建一个触发器来强制执行电话格式。
-
在替换之前修剪电话号码可能会起作用,因为我根据您的要求进行了测试,它可以正常工作