MySQL 如何处理 phone 数字中的加号?

How does MySQL deal with plus sign in phone number?

我正在使用 MySQL 数据库开发应用程序。 phone 以加号开头的数字出现奇怪的行为,例如+13215555555

当然,问题是我正在对部分项目使用 Google Firebase phone 身份验证。 Firebase 将 phone 数字存储为 +13215555555(国家代码加上 phone 数字)

我可以轻松地将 phone 格式的 + 数字推送到数据库。我无法做的是使用带加号的 phone 数字来查询记录。

示例数据:

id      user       phone            email 
1       Abe        +13215555555     abe@fake_email.com 
2       Beth       13215555556      beth@abc.com 
3       Charl      321-555-5557     charl@def.com 

数据在:

const sql = " INSERT INTO `users` ( `user`, `phone`, `user_email` ) +
            " VALUES (?,?,?)";  
const dataReturn = await promisePool.execute(sql, dataArray); 

上面的任何 phone 数字格式都非常适合将数据插入数据库。加号 +3215555555 效果很好。而我在上面看到的是在 Adminer 中观察到的。 phone 数据字段的结构为 varchar(20).

数据输出:

我无法做到的是当 phone 号码以加号开头时通过 phone 号码获取用户记录。

const sql_ui = "SELECT * FROM `users` WHERE `phone` = ? "
const data_return_ui = await promisePool.execute(sql_ui, [ph_string_value]) 

在这种情况下,我无法获得值为 ph_string_value = "+13215555555" 的任何用户结果 请注意,当我手动创建 SQL 语句时

SELECT * FROM `users` WHERE `phone` = +13215555555

我在 Adminer 中测试时得到了预期的结果。不起作用的是来自我的程序的查询,其中 ph_string_value 在内容中带有前导加号。我收到对数据集的空响应。我想了解这个问题的原因。

为什么使用以加号开头的 phone 数字的查询会失败?

(编辑)
注意:当我在查询之前立即执行 console.log("ph_string_value: ", ph_string_value) 时,我确实看到了预期的“+13215555555”..

我正在尝试构建一个简单的可重现问题,仅使用 SQL...

CREATE TABLE `users_SO` (
    `id` int NOT NULL AUTO_INCREMENT,
    `user` varchar(30) NOT NULL,
    `phone` varchar(20) NOT NULL,
    `email` varchar(40) DEFAULT NULL,
    PRIMARY KEY (`phone`),
    KEY `id` (`id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

INSERT INTO `users_SO` ( `user`, `phone`, `email`) VALUES 
      ("Abe", "+13215555555", "abe@fake_email.com"),
      ("Beth", "13215555556", "beth@abc.com"),
      ("Charl", "321-555-5557", "charl@def.com")

SET @ph_string_value = "+13215555555" ;
# Verify the variable holds what we think it holds...
SELECT @ph_string_value as ph_string_value;
SELECT * FROM `users_SO` WHERE `phone` = @ph_string_value;

SET @ph_string_value2 = "13215555556"
# Verify the variable holds what we think it holds...
SELECT @ph_string_value2 as ph_string_value2;
SELECT * FROM `users_SO` WHERE `phone` = @ph_string_value2

管理员 SQL 测试人员的最初结果很奇怪。不确定我是否了解如何使用 https://dbfiddle.uk/?rdbms=mysql_8.0 他们的帮助屏幕帮助不大。

更新,现在 SQl 在 Adminer 中测试时效果很好。没有错误。在 db-fiddle dot com/ 测试时我得到一个奇怪的错误:

Query Error: Error: ER_CANT_AGGREGATE_2COLLATIONS: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='

问题:设置数据库时,哪种排序规则设置似乎最可靠?

糟糕。有一次我确实在获取调用中将 phone 号码传递给内部 API 路由。

async function get_user_info(ph_num) {
    try {
        let response = await fetch(
            ENV_OBJ.WEB_URL +
                "/api/mysql_connect?getType=user_info&ph="+ph_num  <--  Fail
        );
        let user = await response.json();
        if (response.ok) {
            console.log("user: ", user)
            return user;
        }
    } catch (err) {
        console.log("error from get_user_info(): ", err);
    }
}

是的,在到达 API 服务器时,加号已从预期的 phone 字符串值中消失。

修复?

ENV_OBJ.WEB_URL + "/api/mysql_connect?getType=user_info&ph="+encodeURIComponent(ph_num)