어떤 값이 나와야되는데 안나온다고 오류 수정 요청이 있었다. 수정했는데 되게 어이없는 이유였다. 

원인은 이거였다.


테이블 이름이 keyboard이고, qwerty라는 컬럼이 있다고 가정하고, 다음의 쿼리를 날려본다.

SELECT qwerty FROM Keyboard;

이렇게 하면 qwerty 칼럼의 내용들을 잘 가지고 올테다. 하지만 만약 다음과 같은 쿼리를 날리면 어떻게 될까?

SELECT QWERTY FROM keyboard;


정답은 mysql 대소문자 설정에 따라 다르다. 다음과 같은 쿼리를 날려 보았을때

SHOW variables LIKE 'lower_case_table_names';

값이 0인 경우 대소문자를 구분하고, 값이 1인 경우 대소문자를 무시하고, 값이 2인 경우에는 대소문자를 구분하지만 이름 비교에서는 구분하지 않는다. 

구체적은 설명은 다음과 같다. mysql 가이드에서 그대로 긁어왔다. https://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html

ValueMeaning
0

Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement. Name comparisons are case sensitive. You should not set this variable to 0 if you are running MySQL on a system that has case-insensitive file names (such as Windows or macOS). If you force this variable to 0 with --lower-case-table-names=0 on a case-insensitive file system and access MyISAM tablenames using different lettercases, index corruption may result.

CREATE TABLE 혹은 CREATE DATABASE문에서 명시된 대소문자로 데이터베이스명과 테이블명이 디스크에 저장된다. 이름 비교는 대소문자를 구분한다. 만약 우리가 대소문자를 구분하지 않는 파일명을 가지고 있는 시스템(윈도우나 맥 OS) 에서 Mysql을 돌리고 있다면 이 값을 0으로 설정하지 않는 것이 좋다. 만약 우리가 대소문자를 구분하지 않는 파일시스템에서 --lower-case-table-names=0으로 값을 강제로 0으로 만들어 버리고, 다른 대소문자를 사용해서 MyISAM 테이블명에 접근한다면, 인덱스 충돌이 일어날 수도 있다.

1

Table names are stored in lowercase on disk and name comparisons are not case-sensitive. MySQL converts all table names to lowercase on storage and lookup. This behavior also applies to database names and table aliases.

테이블명이 디스크에 소문자로 저장되며 이름 비교는 대소문자를 구분하지 않는다. MySQL은 스토리지와 lookup에 모든 테이블명을 소문자로 전환한다. 이 전환은 데이터베이스명과 테이블 aliase(별칭)에도 적용된다.  

2Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement, but MySQL converts them to lowercase on lookup. Name comparisons are not case sensitive. This works only on file systems that are not case-sensitive! InnoDB table names are stored in lowercase, as for lower_case_table_names=1

CREATE TABLE 혹은 CREATE DATABASE문에서 명시된 대소문자로 데이터베이스명과 테이블명이 디스크에 저장되나, MySQL이 룩업에 소문자로 전환한다. 이름비교는 대소문자를 구분하지 않는다. 이 값은 대소문자를 구분하지 않는 파일 시스템에서만 동작한다! InnoDB 테이블명은 lower_case_table_names=1 조건처럼 소문자로 저장된다. 

여튼 나같은 경우에는 대소문자를 구분하지 않도록 설정은 되어있었지만은, 결과를 가지고올때는 qwerty칼럼이 아니라 QWERTY 칼럼으로 값을 가지고 와서, 키매핑을 잘못 시켜준 상황이었다. (나를 qwerty일거라고 생각하고 코드를 짰는데 QWERTY였던..)


아니 왜 되던게 안되는거야?

ajax 처리를 할때 beforeSend에다가 코드를 작성해주면, request를 보내기 전에 작동한다. 난 요청을 보낼때 로딩을 달거나, 화면을 까맣게 만들어 request를 여러번 날리는 걸 막는데에 활용해오곤 했다.(가장 의도와 맞는 사용법은 언제나 jquery)
잘쓰고 있었는데 어느날 얘가 또 안되기 시작했다. 아래와 같이 코드를 돌렸다. 
/*소스 코드는 http://api.jquery.com/jquery.ajax/ 에서 퍼왔다. 안돌아가는 예임 */
$.ajax({
  url: "https://fiddle.jshell.net/favicon.png",
  beforesend: function( xhr ) {
    xhr.overrideMimeType( "text/plain; charset=x-user-defined" );
  }
}).done(function( data ) {
    if ( console && console.log ) {
      console.log( "Sample of data:", data.slice( 0, 100 ) );
    }
  });

이렇게하면 beforesend가 안먹는다. 


왜냐하면 beforesend가 아니라 beforeSend니까!!!!!!! 

아래처럼 하면 돌아간다. 

/*소스 코드는 http://api.jquery.com/jquery.ajax/ 에서 퍼왔다.  */
$.ajax({
  url: "https://fiddle.jshell.net/favicon.png",
  beforeSend: function( xhr ) {
    xhr.overrideMimeType( "text/plain; charset=x-user-defined" );
  }
}).done(function( data ) {
    if ( console && console.log ) {
      console.log( "Sample of data:", data.slice( 0, 100 ) );
    }
  });

그리고 beforeSend안에 있는 함수가 return false를 내뱉으면 request가 취소되는 것을 명심해야한다. 아! 또 async:false 달아둬서도 안된다. 


오늘도 너무 보람차고 수치스러운 하루였다 :-> 

뭘 하려고 했었냐면..

다른 사람이 올려놓은 브랜치를 remote 서버에서 체크아웃해서 돌려보고 싶었다. 체크아웃쯤은 cheatSheet 보지 않아도 알G알G 하고 이렇게 했다.
git checkout feature-shoveling
error: pathspec 'feature-shoveling' did not match any file(s) known to git.
오래 헤매진 않았지만 sourceTree 같은 툴에 너무 익숙해지다 보니까 터미널로 해결하는 법을 깜박해버렸다. 원인은 remote 의 git에 접속한지 오래 되어 fetch를 받지 않은 것^ㅅ^@@@ 
당황하지 말고 머쓱해하며 다음 명령어를 쳐주자.
git fetch
git checkout feature-shoveling
이렇게 하면 된당. ^-^


+ Recent posts