BIGINT或NUMERIC/ DECIMAL(仅存储数字)

Real-time financial market data for stocks and trends.
Post Reply
shakib75
Posts: 350
Joined: Thu May 22, 2025 5:46 am

BIGINT或NUMERIC/ DECIMAL(仅存储数字)

Post by shakib75 »

浪费的空间:如果数字的长度差别很大,则填充会浪费空间。
填充问题:可能导致意外行为或需要在检索数据时进行修剪。
建议:由于电话号码的长度和格式可变,通常不建议使用。

描述:数字数据类型。BIGINT表示大整数,NUMERIC/DECIMAL表示精确数值。
优点:
强制仅存储数字(但不能存储+、等)-。(
缺点:
去掉前导零:这对于电话号码来说是一个主要问题(例如,0171xxxxxxx变成171xxxxxxx)。
无法存储格式化字符:没有+、-、(、)、空格或扩展名。这意味着您必须存储原始数字并在应用程序中处理所有格式,这可能会很麻烦。
国际化问题: BIGINT如果您打算存储不带的国家代码,那么对于所有国际电话号码来说可能不够大+。
建议: 一般不建议这样做,除非您有非常具体、严格的内部系统,始终使用原始 保加利亚 电报号码列表 数字并在其他地方处理格式。单是前导零的问题就足以让包括孟加拉国在内的许多国家陷入困境。
在 SQL 中存储电话号码的最佳实践:

使用(或者如果需要考虑 Unicode)。VARCHAR(20)这VARCHAR(50)NVARCHAR是最灵活且最广泛接受的方法。
尽可能以标准化、非格式化的方式存储电话号码,或至少以一致的方式存储。
强烈建议国际号码采用E.164 格式+: [国家代码] [用户号码](例如,+8801712345678孟加拉国号码)。这有利于保持一致性并与电话 API 集成。
您可能有两列:(PhoneNumberRaw VARCHAR(20)用于 E.164)和PhoneNumberDisplay VARCHAR(50)(用于本地化格式化版本)。
在应用层实现验证:
libphonenumber在您的应用程序代码(PHP、Python、Java、Node.js 等)中使用正则表达式(regex)或专用电话号码解析库(例如,各种编程语言中的 Google 库)来验证和格式化电话号码,然后再将其发送到数据库。
Post Reply