복붙노트

[SQL] 에는 mysql - 인용 번호 나하지?

SQL

에는 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에서이 동작 표준인가?

감사!

해결법

  1. ==============================

    1.MySQL은 그것을 할 수있는 최선으로 PHP와 같은 많은, 그리고 의지 자동 변환 데이터 유형. 당신은 INT 필드 (왼쪽)와 협력하고 있기 때문에, 그냥 9가되도록,뿐만 아니라 int 형으로 인수의 오른쪽을 변환 투명에 '9'를 시도 할 것이다.

    MySQL은 그것을 할 수있는 최선으로 PHP와 같은 많은, 그리고 의지 자동 변환 데이터 유형. 당신은 INT 필드 (왼쪽)와 협력하고 있기 때문에, 그냥 9가되도록,뿐만 아니라 int 형으로 인수의 오른쪽을 변환 투명에 '9'를 시도 할 것이다.

    엄밀히 말하면, 따옴표는 필요하지 않습니다, 그것은 CPU 시간의 비트를 낭비하며,이 타입 캐스팅 / 변환을 수행하기 위해 MySQL을 강제로. 당신이 구글 크기의 작업을 실행하지 않는 한 실제로, 이러한 변환 오버 헤드 현미경으로 작은 될 것입니다.

  2. ==============================

    2.당신은 숫자 주위에 따옴표를 넣어해서는 안됩니다. 이에 대한 타당한 이유가있다.

    당신은 숫자 주위에 따옴표를 넣어해서는 안됩니다. 이에 대한 타당한 이유가있다.

    진짜 문제는 타입 캐스팅에 온다. 따옴표 안에 숫자를 넣을 때, 그것은 문자열로 처리하고 쿼리를 실행하기 전에 MySQL은 숫자로 변환해야합니다. 이 시간의 작은 금액을 취할 수 있지만, 진짜 문제는 MySQL이 당신의 문자열을 변환하는 좋은 일을하지 않을 때 발생하기 시작한다. 예를 들어, MySQL은 정수 (123)에 '123'와 같은 기본적인 문자열을 변환하지만, 부동 소수점에, '18015376320243459'과 같은 몇 가지 큰 숫자를 변환합니다. 부동 소수점하는 둥근 수 있기 때문에, 쿼리가 일관되지 않은 결과를 반환 할 수 있습니다. 유형이 여기에 캐스팅에 대해 더 알아보세요. 서버 하드웨어와 소프트웨어에 따라 결과가 달라질 수 있습니다. MySQL은이 설명합니다.

    당신은 SQL 주입에 대해 걱정하는 경우, 항상 먼저 값을 확인하고 비 숫자를 제거하기 위해 PHP를 사용합니다. 당신은이에 대한 preg_replace이다를 사용할 수 있습니다 preg_replace이다를 ( "/ [^ 0-9] /", "", $ 문자열)

    당신이 따옴표를 사용하여 SQL 쿼리를 작성하는 경우 또한, 그들은 PostgreSQL을 또는 Oracle 등의 데이터베이스에서 작동하지 않습니다.

  3. ==============================

    3.AFAIK는 표준이지만 나쁜 관행 때문에 간주됩니다 - A의 그것을 사용하는 절은 인덱스를 사용 최적화를 방지 할 수 WHERE (계획이 표시되어야합니다 설명) - 데이터베이스에서 문자열을 숫자로 변환하기 위해 추가 작업을 할 수있다 - 당신은 ( '9.4') 부동 소수점 숫자에 대해이 작업을 사용하는 경우, 당신은 문제로 실행하겠습니다 경우 클라이언트와 서버 사용을 다른 언어 설정 (9,4 대 9.4)

    AFAIK는 표준이지만 나쁜 관행 때문에 간주됩니다 - A의 그것을 사용하는 절은 인덱스를 사용 최적화를 방지 할 수 WHERE (계획이 표시되어야합니다 설명) - 데이터베이스에서 문자열을 숫자로 변환하기 위해 추가 작업을 할 수있다 - 당신은 ( '9.4') 부동 소수점 숫자에 대해이 작업을 사용하는 경우, 당신은 문제로 실행하겠습니다 경우 클라이언트와 서버 사용을 다른 언어 설정 (9,4 대 9.4)

    한마디로 : 그것 (하지만 YMMV)를하지 않는다

  4. ==============================

    4.이 표준 동작하지 않습니다.

    이 표준 동작하지 않습니다.

    MySQL은 5.5하십시오. 이 기본 SQL 모드입니다

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

    ANSI와 전통 오라클과 PostgreSQL에 의해 더 엄격하게 사용된다. 는 SQL 모드 MySQL의 허가 IF를 설정해야하며 당신은 SQL이 더 ANSI-준수하도록합니다. 그렇지 않으면, 당신은 일을 접촉 할 필요가 없습니다. 나는 그렇게 해본 적이 없다.

  5. ==============================

    5.이 옵션을 선택합니다, 당신은 더 나은 이해할 수 ...

    이 옵션을 선택합니다, 당신은 더 나은 이해할 수 ...

    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)
    
  6. ==============================

    6.당신은 숫자를 인용 할 필요가 없습니다하지만 당신은 그것을 일치로하는 경우에 항상 좋은 습관이다.

    당신은 숫자를 인용 할 필요가 없습니다하지만 당신은 그것을 일치로하는 경우에 항상 좋은 습관이다.

  7. ==============================

    7.문제는, 이제 우리는 당신이이 쿼리를 실행하면, 형 FLOAT의 CURRENT_BALANCE라는 열이 사용자라는 테이블을 가지고 있다고 가정 해 봅시다한다 :

    문제는, 이제 우리는 당신이이 쿼리를 실행하면, 형 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로 업데이트됩니다

  8. ==============================

    8.그것은 열 유형에 따라 달라집니다! 당신이 실행하는 경우

    그것은 열 유형에 따라 달라집니다! 당신이 실행하는 경우

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

    MySQL의에서 / 사용자 이름이 NULL없는 경우에는 모든 기록을 얻을 것이다 마리아는-DB.

    열이 String 유형 인 경우 항상 값을 인용 (CHAR, VARCHAR, ...), 그렇지 않으면 예기치 않은 결과를 얻을 수 있습니다!

  9. from https://stackoverflow.com/questions/6781976/mysql-quote-numbers-or-not by cc-by-sa and MIT license