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)
我正在使用 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)