MYSQL inserting wrong info - mysql

I am inserting value
insert into user (name,fbid) Values ('Adi Mathur',100000564553314)
but in the database i see the value if fbid to be
2147483647
Why ? How should i fix it ?
fbid int(50)

As explained in the manual, the maximum value of a (signed) INT, which occupies 4 bytes/32 bits, is 2,147,483,647; for integer data types, the number in parenthesis is the display width, which only affects the way that the data is displayed, not how much space it is allocated for storage:
M indicates the maximum display width for integer types. For floating-point and fixed-point types, M is the total number of digits that can be stored (the precision). For string types, M is the maximum length. The maximum permissible value of M depends on the data type.
You probably want a BIGINT.

Related

How does the varchar(limit) work?

I've been working with MySQL and very vaguely understand the VARCHAR(This Number Here) part. Is that number the total amount of characters the column can store?
For instance, lets say i have a VARCHAR(400) latin1_general_ci, does the 400 mean a 400 byte limit on the string, or that the string can have 400 characters? How big of a string can i store in that column variable?
This is the maximum string length of the field (see here) (NOT bytes):
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.
This will allow 30 characters regardless of the encoding.
Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535. The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used.
In contrast to CHAR, VARCHAR values are stored as a 1-byte or 2-byte length prefix plus data. The length prefix indicates the number of bytes in the value. A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require more than 255 bytes.

MySQL different integer datatype operation

There are different datatypes used to build a column in MySQL table. For example SMALLINT, MEDIUMINT, and INT. I understand that different datatype will affect table size according to column types. Therefore, its unnecessary to assign UNSIGNED INT to a value which ranges between 0-1000.
What happens if you multiply values of different datatypes in MySQL (e.g. SMALLINT * INT)? What MySQL datatype do you need to store the result?
MySQL defines some rules for arithmetic operations.
In case of +, -, * result is calculated to BIGINT (64-bit) precision if both operands are integers (e.g. SMALLINT, INT)
If both operands are integer and any of them are UNSIGNED, the result is an unsigned integer. For subtraction (-) if NO_UNSIGNED_SUBTRACTION SQL mode is enabled, the result will be signed.
If any of the operands of a +, -, /, *, % is real (e.g. FLOAT or DOUBLE) or string value (e.g. '10.13e-3') the precision of the result is the precision of the operand with the maximum precision.
It is safe to do arithmetic operations between columns with different datatypes. MySQL will automatically convert into appropriate format.
As for storing its result, there are some constraints.
If out-of-range value is inserted, largest endpoint will be stored (e.g. inserting 130 to TINYINT will store 127 and raise warning). If strict mode is enabled, insertion will fail and raise error.
Integer overflow results in silent wraparound (e.g. 9223372036854775807 + 1 = -9223372036854775808. This is because its the largest possible operation using BIGINT datatype).
When a floating-point or fixed-point column is assigned a value that exceeds the range implied by the specified (or default) precision and scale, MySQL stores the value representing the corresponding endpoint of that range
Floating-point overflow produces NULL result. Some operation can result in +INF, -INF or `NaN'.
DECIMAL datatype, if overflowed, will be truncated. And raise warning.
References (from dev.mysql.com):
Out of range & Overflow
Arithmetic functions

Out of range value for column 'contact_no' at row 1

I was trying to add a number with a length of 11 but when I input it in the database it can't. If I try to add a number with a length of 10 it can.
This is the error:
ERROR 1264: 1264: Out of range value for column 'contact_no' at row 1
SQL Statement:
INSERT INTO `mcs`.`new_table` (`id`, `contact_no`) VALUES ('1', '12345678901')
It's not clear what question you are asking.
Why is this error being returned?
Likely, the contact_no column is declared with datatype of INT, a 32-bit integer, and you attempted to assign a value larger than the supported maximum value.
The maximum value for a signed 32-bit integer is 2,147,483,647. (that decimal value of 2^31-1. For an unsigned 32-bit integer, maximum value is 2^32.)
Some other question that wasn't asked
If you need to store values larger than the maximum supported by the INT datatype, you could define the column as a different datatype.
For example, BIGINT gives a maximum value of 2^63-1 for unsigned.
If you need a maximum of 12 decimal digits, you could use a DECIMAL(12) datatype.
Change your data type of contact_no to BIGINT.
Check range of different data type at MYSQL official website.
I personally recommend you to use varchar, as you don't need to compare contact number with any field.
Please check datatype of contact_no column.
'12345678901' is exceeding its size.

mysql float data field not accepting every float number

I have a float data field :
`total` float(20,2) unsigned NOT NULL,
I want to insert a float number like : "815032.68" but it's not accepted and the number is rounded to 815032.69. why?
Use a fixed-point data type
`total` DECIMAL(20,2) unsigned NOT NULL
The DECIMAL and NUMERIC types store exact numeric data values. These types are used when it is important to preserve exact precision, for example with monetary data.
MySQL Doc
Floating-point data types can only store approximate numbers.
Floats are 32 bit numbers stored as mantissa and exponents,the maximum value a FLOAT can have is +8388608*10^127 and the minimum is -8388608*10^127. This means only 7 significant digits, and your FLOAT definition used 20.Use double data type.

What are the consequences of varchar?

I have a MySQL database and I am wondering about the consequences of the varchar size on my query performances.
For example, what would be the difference between a varchar(10) and a varchar(50) in terms of the performances or database size.
If I have something like 10000 rows, would it affect a lot on performances or is it insignificant?
Note : I don't do any join on this column (if that is important)
varchar(10) means that maximum allowed bytes is 10 and varchar(50) means that maximum allowed bytes is 50. Basically, a varchar(10) is no different disk-wise than a varchar(128).So, in whatever manner you declare your columns, it wont make a difference on the storage end. But it will certainly make a difference while making a query.
From the source:
Values in VARCHAR columns are variable-length strings. The length can
be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to
65,535 in 5.0.3 and later versions. The effective maximum length of a
VARCHAR in MySQL 5.0.3 and later is subject to the maximum row size
(65,535 bytes, which is shared among all columns) and the character
set used.
There shouldn't be any real difference in performances between a VARCHAR(10) and VARCHAR(50).
The real difference would be between CHAR and VARCHAR.
http://dev.mysql.com/doc/refman/5.0/en/char.html
The length of a CHAR column is fixed to the length that you declare
when you create the table. The length can be any value from 0 to 255.
When CHAR values are stored, they are right-padded with spaces to the
specified length. When CHAR values are retrieved, trailing spaces are
removed.
Values in VARCHAR columns are variable-length strings. The length can
be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to
65,535 in 5.0.3 and later versions. The effective maximum length of a
VARCHAR in MySQL 5.0.3 and later is subject to the maximum row size
(65,535 bytes, which is shared among all columns) and the character
set used. See Section E.7.4, “Limits on Table Column Count and Row
Size”.
Replacing every VARCHAR by CHAR columns might improve performances, since then, rows will have fixed size, thus reducing fragmentation and somehow optimizing disks access.
That being said, if you have only 10000 rows, I doubt you would see any real difference, unless maybe if you have unusually "long" rows.