IT

MySQL에서는 숫자를 인용해야 하나요, 말아야 하나요?

itgroup 2022. 11. 18. 21:35
반응형

MySQL에서는 숫자를 인용해야 하나요, 말아야 하나요?

예: CLI에서 데이터베이스와 테이블을 만들고 데이터를 삽입합니다.

CREATE DATABASE testdb CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
USE testdb;
CREATE TABLE test (id INT, str VARCHAR(100)) TYPE=innodb CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
INSERT INTO test VALUES (9, 'some string');

이제 이렇게 할 수 있고 다음 예제가 작동합니다(따옴표는 보이는 것에 영향을 주지 않습니다).

SELECT * FROM test WHERE id = '9';
INSERT INTO test VALUES ('11', 'some string');

이 예에서는 실제로 mysql에 INT로 저장되어 있는 문자열로 행을 선택하고 INT 열에 문자열을 삽입합니다.

이게 왜 여기서 작동하는 건지 잘 모르겠어요.INT 열에 문자열을 삽입할 수 있는 이유는 무엇입니까?

모든 MySQL 데이터 유형을 문자열로 삽입할 수 있습니까?

이 동작은 다른 RDBMS에서 표준입니까?

MySQL은 PHP와 매우 유사하며 가능한 한 데이터 유형을 자동 변환합니다.int 필드(왼쪽)를 사용하고 있기 때문에 인수의 오른쪽도 int로 투과적으로 변환하려고 합니다.'9'막이 오르다9.

엄밀히 말하면 따옴표는 불필요하고 MySQL에 타이핑/변환을 강요하기 때문에 CPU에 약간의 시간을 낭비하게 됩니다.실제로 Google 규모의 작업을 수행하지 않는 한 이러한 변환 오버헤드는 매우 작습니다.

숫자에 따옴표를 붙이면 안 돼요.여기에는 타당한 이유가 있다.

진짜 문제는 활자 주조로 귀결된다.따옴표 안에 숫자를 넣으면 문자열로 처리되며 MySQL이 쿼리를 실행하기 전에 숫자로 변환해야 합니다.시간이 조금 걸릴 수 있지만 MySQL이 문자열을 제대로 변환하지 못할 때 실제 문제가 발생하기 시작합니다.예를 들어 MySQL은 '123'과 같은 기본 문자열을 123으로 변환하지만 '18015376320243459'와 같은 일부 큰 숫자는 부동 소수점으로 변환합니다.부동 소수점을 반올림할 수 있으므로 쿼리에서 일관되지 않은 결과가 반환될 수 있습니다.활자 캐스팅에 대한 자세한 내용은 여기를 참조하십시오.이러한 결과는 서버의 하드웨어와 소프트웨어에 따라 달라집니다.MySQL이 설명합니다.

SQL 주입이 걱정되는 경우 항상 먼저 값을 확인하고 PHP를 사용하여 모든 비숫자를 제거하십시오.preg_replace를 사용하여 다음을 수행할 수 있습니다.preg_replace("/[^0-9]/", "", $string)

또한 SQL 쿼리를 따옴표로 작성하면 Postgre와 같은 데이터베이스에서는 작동하지 않습니다.SQL 또는 Oracle.

이것 좀 봐, 더 잘 이해할 수 있을 거야...

mysql> EXPLAIN SELECT COUNT(1) FROM test_no WHERE varchar_num=0000194701461220130201115347;
+----+-------------+------------------------+-------+-------------------+-------------------+---------+------+---------+--------------------------+
| id | select_type | table                  | type  | possible_keys     | key                  | key_len | ref  | rows    | Extra                    |
+----+-------------+------------------------+-------+-------------------+-------------------+---------+------+---------+--------------------------+
|  1 | SIMPLE      | test_no | index | Uniq_idx_varchar_num | Uniq_idx_varchar_num | 63      | NULL | 3126240 | Using where; Using index |
+----+-------------+------------------------+-------+-------------------+-------------------+---------+------+---------+--------------------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT COUNT(1) FROM test_no WHERE varchar_num='0000194701461220130201115347';
+----+-------------+------------------------+-------+-------------------+-------------------+---------+-------+------+-------------+
| id | select_type | table                  | type  | possible_keys     | key               | key_len | ref   | rows | Extra       |
+----+-------------+------------------------+-------+-------------------+-------------------+---------+-------+------+-------------+
|  1 | SIMPLE      | test_no | const | Uniq_idx_varchar_num | Uniq_idx_varchar_num | 63      | const |    1 | Using index |
+----+-------------+------------------------+-------+-------------------+-------------------+---------+-------+------+-------------+
1 row in set (0.00 sec)

mysql>
mysql>
mysql> SELECT COUNT(1) FROM test_no WHERE varchar_num=0000194701461220130201115347;
+----------+
| COUNT(1) |
+----------+
|        1 |
+----------+
1 row in set, 1 warning (7.94 sec)

mysql> SELECT COUNT(1) FROM test_no WHERE varchar_num='0000194701461220130201115347';
+----------+
| COUNT(1) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

AFAIK는 표준이지만 나쁜 관행으로 간주됩니다.
인덱스를 할 수 을 하면 WHERE는 인덱스를 사용할 수 없습니다.
- 추가 해야 합니다. - 숫자 변환은 필수입니다.
숫자에 언어 설정( 9, 문제가 - 9.4')

요컨대 하지 마세요(단, YMMV)

이것은 표준 동작이 아닙니다.

MySQL 5.5의 경우 기본 SQL 모드입니다.

mysql> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
|            |
+------------+
1 row in set (0.00 sec)

ANSI 및 TRADIAL은 Oracle 및 Postgre에서 보다 엄격하게 사용됩니다.SQL. MySQL이 허용하는 SQL 모드는 SQLANSI 호환성을 높이려는 경우에만 설정해야 합니다.그렇지 않으면, 당신은 아무것도 만질 필요가 없습니다.나는 그렇게 한 적이 없다.

열 유형에 따라 달라집니다!

SELECT * FROM `users` WHERE `username` = 0;

mysql에는 mysql/mysql-db에 있는 됩니다.username특수.

열이 문자열 유형(char, varchar 등)인 경우 항상 값을 따옴표로 묶으십시오. 그렇지 않으면 예기치 않은 결과가 발생합니다.

굳이 숫자를 인용할 필요는 없지만 꾸준히 하면 항상 좋은 습관이다.

문제는 다음 쿼리를 실행할 경우 사용자라는 테이블이 있다고 가정해 보겠습니다.이 테이블에는 FLOAT 유형의 current_balance라는 컬럼이 있습니다.

UPDATE `users` SET `current_balance`='231608.09' WHERE `user_id`=9;

마찬가지로 다음 쿼리를 시도하면 MySQL이 반올림을 했기 때문에 current_balance 필드가 231608로 업데이트됩니다.

UPDATE `users` SET `current_balance`='231608.55' WHERE `user_id`=9;

current_balance 필드가 231609로 업데이트됩니다.

언급URL : https://stackoverflow.com/questions/6781976/in-mysql-should-i-quote-numbers-or-not

반응형