mysql设计表结构,varchar和varbinary如何选择?

发表于:
来源:阿酷技术学习
作者:simple

有时候,我们在设计一个表结构时,通常一个字段char和varchar,binary和varbinary我们都知道区别,但是有时候总是在varchar和varbinary上拿不定,用varchar还是用varbinary呢,我也拿不准。。。本文是我的学习,有不妥之处,请指教。。

几个概念:

字节byte:

计算机内存中的存储单元,1个字节8位。我们通常说内存多大,数据多大是指字节。

字符char:

我们看到的文字符号字母。它在计算机中是编码(utf8,gb2312)成字节表示。

char_length():

Returns the length of the string str, measured in characters. A multibyte character counts as a single character. This means that for a string containing five 2-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH() returns 5.

返回字符串以字符个数表示的大小。

length():

Returns the length of the stringstr, measured in bytes. A multibyte character counts as multiple bytes. This means that for a string containing five 2-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH() returns 5.

返回字符串以字节个数表示的大小。

char和varchar:

The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters.

如果表字段这样定义,表示这列最大存储的字符个数

binary和varbinary:

The permissible maximum length is the same for BINARY and VARBINARY as it is for CHAR and VARCHAR, except that the length for BINARY and VARBINARY is a length in bytes rather than in characters.

如果表字段这个定义,表示这列最大字节表示个数。

那么对于我们在设计表的时候,定义列到底用VARCHAR还是VARBINARY呢?

我觉得这与你的程序设计有关。

比如一篇文章来说,文章标题肯定是一个字符串,那么就用VARCHAR,比如文章的关键字,那么肯定是个数组,那么我建议存储为VARBINARY.

还有重要的一点,当列设计为VARBINARY(X)时,X表示字节数,如果采用UTF-8存储,那么就需要设想一下,你此列最多需要多少字符,那么需要字符数x3个字节。否则存储时有可以截断。。

还有一点我觉得也存为字节比较好。比如一篇文章中可能会有emoji表情,比如存取的QQ,微信用户昵称。那么此emoji是4个字节。一般我们数据库的字符集是utf8.当你如果是字符串时,则就会存储出错。所以直接设为字节,那么可以直接存取,不用再重新修改数据库字符集为utf8mb4