1

像电话这样的值,我们应该存储它已经格式化,还是在请求时格式化它?哪个性能更好?

在巴西等国家,我们有代码 55,城市代码如 11,但我们有 5 或 4 位加 4 位的电话号码,例如:+55 (11) 9999-9999 或 +55 (21) 9999-9999,存储未格式化的值,少数国家,您有 1、2、3 或 4 位数字的国家代码,在请求时将变得难以格式化,因为那!存储格式化后,我将使用更多存储空间,INT < VARCHAR。但是通过处理,我们只是抛出要显示的值。如果我像数字一样存储它,我必须有很多 IF 来识别国家和格式,占用空间小但处理时间长。

对不起我的英语。

4

5 回答 5

6

好吧,考虑一下典型的现代台式计算机每秒可以进行 6 或 70 亿次计算。

数据应该以最适合您在数据库中执行的操作的格式存储:搜索、排序、比较。电话号码可能来自不同格式的 UI(例如“(800) 555-1212”、“800-555-1212”、“800 555-1212”、“8005551212”)。允许诸如匹配之类的不同功能几乎意味着格式在存储到数据库之前被剥离,然后在显示时被美化。

格式化电话号码的处理器开销微不足道:可能需要 40 或 50 个处理器周期。例如,在 i5 上,这将远远少于一微秒。

所以我会投票赞成:存储原始,显示漂亮。

于 2013-07-03T03:12:00.270 回答
2

由于格式化是一个独立于数据存储的显示问题,并且由于同一条数据可能会根据环境而采用不同的格式,因此您应该将未格式化的数据存储在数据库中,并在应用程序中对其进行适当的格式化。

您可以构建一个应用程序,其中可以从不同的语言环境查看相同的数据。相同的金额、时间点或数字可能需要针对不同的用户采用不同的格式,具体取决于他们来自哪里。您的数据模型(其中 MySQL 是很大一部分)根本不应该处理格式化,否则表示层需要将数据从一种格式转换为另一种格式。这是次优的,并且可能导致可维护性噩梦。这就是为什么您应该努力以独立于演示格式的方式存储数据。

于 2013-07-03T03:12:28.633 回答
0

按要求格式化!

任何接受过任何正式学术数据库培训的人都会告诉你这一点。如果这种格式化发生在数据库客户端而不是数据库本身,那就更好了。

于 2013-07-03T03:41:12.930 回答
0

我只将电话号码存储为数字。这会占用数据库中的空间。格式可以改变。此外,在编写简洁的代码和重用代码时,这是需要努力的。与数据库表中少于 100 个左右的格式化电话号码相比,此函数占用的空间更少。

    function format_phone($phone = '', $convert = false, $trim = true){
        // If we have not entered a phone number just return empty
        if (empty($phone)) {
            return '';
        }

        // Strip out any extra characters that we do not need only keep letters and numbers
        $phone = preg_replace("/[^0-9A-Za-z]/", "", $phone);

        // Do we want to convert phone numbers with letters to their number equivalent?
        // Samples are: 1-800-TERMINIX, 1-800-FLOWERS, 1-800-Petmeds
        if ($convert == true) {
            $replace = array('2'=>array('a','b','c'),
                     '3'=>array('d','e','f'),
                         '4'=>array('g','h','i'),
                     '5'=>array('j','k','l'),
                                     '6'=>array('m','n','o'),
                     '7'=>array('p','q','r','s'),
                     '8'=>array('t','u','v'),
                     '9'=>array('w','x','y','z'));

            // Replace each letter with a number
            // Notice this is case insensitive with the str_ireplace instead of str_replace 
            foreach($replace as $digit=>$letters) {
                $phone = str_ireplace($letters, $digit, $phone);
            }
        }

        // If we have a number longer than 11 digits cut the string down to only 11
        // This is also only ran if we want to limit only to 11 characters
        if ($trim == true && strlen($phone)>11) {
            $phone = substr($phone, 0, 11);
        }                        

        // Perform phone number formatting here
        if (strlen($phone) == 7) {
            return preg_replace("/([0-9a-zA-Z]{3})([0-9a-zA-Z]{4})/", "$1-$2", $phone);
        } elseif (strlen($phone) == 10) {
            return preg_replace("/([0-9a-zA-Z]{3})([0-9a-zA-Z]{3})([0-9a-zA-Z]{4})/", "($1) $2-$3", $phone);
        } elseif (strlen($phone) == 11) {
            return preg_replace("/([0-9a-zA-Z]{1})([0-9a-zA-Z]{3})([0-9a-zA-Z]{3})([0-9a-zA-Z]{4})/", "$1($2) $3-$4", $phone);
        }

        // Return original phone if not 7, 10 or 11 digits long
        return $phone; 
    }
于 2013-07-03T03:13:51.657 回答
0

我通常喜欢在报告/显示上格式化数据,可以节省空间并在某些情况下可以提高性能。

最终,我认为这取决于您如何使用数据。如果电话号码不用于分析并且只是详细信息,那么存储格式化的字符串不会有太大的伤害。

如果您将使用该字段执行任何计算,请务必将其保存在适当的数据类型中。姓名/地址/电话/邮编是我经常保留为几乎没有什么后果的字符串的字段。

于 2013-07-03T03:16:25.247 回答