MySQL에서 이모티콘(Emoji)를 저장하려고 하면 Incorrect string value 에러 메세지가 발생하게 됩니다.


MySQL의 utf8은 3byte로 표현되는 범위내의 문자만 입력할 수 있습니다.


하지만 이모티콘(Emoji)는 4byte로 표현되기 때문에 위와같은 에러가 발생합니다.


MySQL 5.5.3부터 4byte를 지원하는 utf8mb4라는 캐릭터셋이 추가되었습니다. 


따라서 이모티콘을 삽입하기 위해서는 테이블의 캐릭터셋을 uft8mb4로 변경해야 합니다.


여러가지 방법이 있지만 저는 mysql 설정파일 my.cnf파일을 수정했습니다.


MySQL 5.5.3이상에서만 가능하기 때문에 이전 버전이라면 업데이트를 해줘야 합니다.



1. /etc/my.cnf에 내용을 추가해줍니다.


[mysqld] 

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci



2. MySQL 서비스를 재시작해줍니다.


servicce mysqld restart





출처 : http://jabstorage.tistory.com/23

Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation


mysql에서 다음과 같은 오류가 발생했다면 character set의 문제라고 볼수 있습니다.


1. mysql에 접속합니다.


[root@localhost~]# mysql -uroot -p

Enter password:


2. 데이터 베이스를 선택합니다.


[root@localhost~]# use 내가사용할db이름;


예시)

[root@localhost~]# use changmin;


3. 테이블의 collation을 변경해줍니다.


[root@localhost~]# alter table 테이블이름 default character set utf8 collate utf8_general_ci;


예시)

[root@localhost~]# alter table changmin default character set utf8 collate utf8_general_ci;


 utf8이 아닌 다른 캐릭터셋을 변경하고 싶다면 다른 캐릭터셋을 입력하시면 됩니다.


엔티티(Entity)

HTML에는 미리 예약된 몇몇 문자가 있으며, 이러한 문자를 HTML 예약어(reserved characters)라고 부릅니다.

이러한 HTML 예약어를 HTML 코드에서 사용하면, 웹 브라우저는 그것을 평소와는 다른 의미로 해석합니다.

따라서 HTML 예약어를 기존에 사용하던 의미 그대로 사용하기 위해 별도로 만든 문자셋을 엔티티(entity)라고 합니다.

 

엔티티의 형태는 다음과 같습니다.

문법

&엔티티이름;
또는
&#엔티티숫자;


다음 예제는 HTML 코드 내에서 꺾쇠괄호(<>)를 사용하면 웹 브라우저가 그것을 어떻게 해석하는지 보여줍니다.

예제

 

<p><p> 태그는 두 번째로 큰 제목을 나타내는 태그입니다.</p>

<p>&lt;p&gt;태그는 단락을 나타내는 태그입니다.</p>

 

 

위의 예제처럼 HTML 코드에서 사용된 꺾쇠괄호(<>)는 HTML 태그의 시작과 끝의 의미로 해석됩니다.

 

엔티티(entity)의 이름은 대소문자를 구분합니다.

 

HTML에서 제공하는 대표적인 엔티티(entity)는 다음과 같습니다.

엔티티 문자엔티티 이름16진수 엔티티 숫자설명
 &nbsp;&#160;줄 바꿈 없는 공백
<&lt;&#60;보다 작은
>&gt;&#62;보다 큰
&&amp;&#38;AND 기호
"&quot;&#34;큰따옴표
'&apos;&#39;작은따옴표

 

HTML에서 사용할 수 있는 모든 엔티티에 대한 더 자세한 정보를 원한다면, W3C 공식 사이트를 방문하여 확인할 수 있습니다.


발음 구별 부호(diacritical marks)

발음을 나타내는 부호를 악센트(accent)라고 합니다.

이러한 악센트는 단독으로는 사용하지 않으며, 보통 다른 문자와 함께 사용됩니다.

이것을 정확하게 표현하기 위하여 HTML에서는 다음과 같은 발음 구별 부호를 별도로 제공하고 있습니다.

 

HTML에서 제공하는 대표적인 발음 구별 부호(diacritical marks)는 다음과 같습니다.

발음 구별 부호문자16진수 엔티티결과
  ̀aa&#768;
  ́aa&#769;
̂aa&#770;
 ̃aa&#771;
 ̀OO&#768;
 ́OO&#769;
̂OO&#770;
 ̃OO&#771;

 

예제

 

<p>j에 악센트가 있다는 발음 기호는 [j&#769;]입니다.</p>



심볼(Symbol) 특수문자

HTML 예약어 이외에도 키보드에 입력할 수 없는 문자를 표현하기 위한 심볼 특수문자를 사용할 수 있습니다.

이러한 심볼 특수문자에는 수학 용어, 그리스 문자, 국제 통화 등이 있습니다.

 

HTML에서 제공하는 대표적인 심볼(Symbol) 특수문자는 다음과 같습니다.

심볼 특수문자엔티티 이름16진수 엔티티설명
¢&cent;&#162;센트
£&pound;&#163;파운드화
¥&yen;&#165;엔화
&euro;&#8364;유로화
©&copy;&#169;저작권
®&reg;&#174;등록상표
×&times;&#215;곱셈
÷&divide;&#247;나눗셈



출처 http://tcpschool.com/html/html_text_entities

1.  head 태그 사이에 script태그 넣기


<head>
<script>
//내용넣기
</script>
</head>


2. body태그 사이에 script태그 넣기


<body>
<script>
//내용넣기
</script>
</body>



Placing scripts at the bottom of the <body> element improves the display speed, because script compilation slows down the display.


<body> 요소의 맨 아래에 스크립트를 배치하면 스크립트 컴파일이 화면 속도를 늦추기 때문에 표시 속도가 향상됩니다.



그렇다고 합니다...

'개인공부 > 창민 :)' 카테고리의 다른 글

cross domain  (0) 2018.01.12
centos APM 버전 (2017.12.10)  (0) 2017.12.15

해결하고싶은 문제



$.ajax() 같은 ajax 관련 함수를 호출할 때 타겟이 되는 URL이 클라이언트와 다른 도메인이면 호출이 안 된다.

 

http://test01.co.kr 에서 ajax로 http://test02.co.kr 라는 API를 호출할 수는 없다는 말이다.

 

자바스크립트(Javascript) 보안 정책 중에 하나인 동일 근원 정책(Same-Origin Policy) 정책에 걸리게 되기 때문이다.



http://test02.co.kr/data.php 의 내용은 다음과 같다.

{"name":"changmin", "age":"27"}



http://test01.co.kr/get_data.php의 내용이 다음과 같다고 하자.

<script type="text/javascript"> $.ajax({ url: "http://test01.co.kr/data.php",

}) .done(function(data) { alert(data.name ); });

</script>


http://test02.co.kr/get_data.html은 changmin라고 표시하지 못한다.
그 이유는 jQuery가 서로 다른 도메인간에는 데이터를 읽어오지 못하도록 차단하기 때문이다.
test01.co.kr에서 test02.co.kr의 데이터를 가져오려고 하기때문에 jQuery가 훼방을 놓고있는 것이다.




해결방법


test01.co.kr과 test02.co.kr을 통제할 수 있다면, 위의 두 파일을 살짝 고쳐서 http://test01.co.kr/get_data.html이 changmin 이라고 표시할 수 있다.

http://test01.co.kr/get_data.html 의 내용을 다음과 같이 수정한다.

<script type="text/javascript"> $.ajax({ url: "http://test02.co.kr/service.php?callback=?",

dataType : "jsonp"

}).done(function(data) {

alert(data.name );

});

</script>

callback=? 라는 표현은 jQuery가 cross domain 기능을 제공하기위해 사용하는 키워드같은 것이다. 그대로 타이핑해 넣어야 한다.


http://test02.co.kr/service.php 의 내용을 다음과 같이 수정한다.

<?php echo $_GET['callback'] . '({"name":"changmin", "age":"27"})'; ?>

JSON 데이터를 padding하고있는 이 모습을 가리켜 JSON with padding이라 말하고, JSONP라고 줄여서 말한다.
$_GET['callback']을 출력해보면 길이가 아주 긴 임의의 문자열인 것을 확인할 수 있다. 그 문자열은 jQuery가 즉흥적으로 만들어낸 함수이다. (아마도 json parser 함수일 것이다).


이제 http://test01.co.kr/get_data.html이 changmin라고 표시하게 되었다.





출처 http://eun-sung-hun.blogspot.kr/2015/01/jsonp-cross-domain.html




'개인공부 > 창민 :)' 카테고리의 다른 글

script태그 head와 body에서의 차이점  (0) 2018.01.15
centos APM 버전 (2017.12.10)  (0) 2017.12.15

1. mysql 실행


[root@localhost ~]# mysql -uroot -p

Enter password: "비밀번호 입력한다"


2. 


show variables like 'c%'; 


명령어 입력해서 character set을 확인합니다.


3.


quit


명령어를 입력해서 mysql실행을 종료합니다.


4. 


vi /etc/my.cnf


명령어를 입력해서 vi편집기를 통해 열어줍니다.


[mysql]

default-character-set = utf8


[mysqld]

character-set-client-handshake=FALSE

init_connect="SET collation_connection = utf8_general_ci"

init_connect="SET NAMES utf8"

character-set-server = utf8

collation-server = utf8_general_ci


[client]

default-character-set = utf8


위의 내용을 추가합니다.

vi편집기 명령어를 모른다면 검색해서 익숙해지자...


5.


service mysql restart


mysql을 재실행합니다.


6. 


show variables like 'c%'; 


다시 확인해줍니다.


7. 


만약 아직 database가 latin1으로 나온다면 데이터베이스 삭제후 다시 만들어줘야한다...


drop database DB이름;

create database DB이름;


끝~~







다음과 같은 오류가 발생한다면 PHP시간대 설정이 안되어있는 경우이다.


https://zetawiki.com/wiki/PHP_%EC%8B%9C%EA%B0%84%EB%8C%80_%EC%84%A4%EC%A0%95


* 확인


cat /etc/php.ini | grep timezone


* 수정


- sed로 수정

grep date.timezone /etc/php.ini

cp /etc/php.ini /etc/php.ini.old

sed -i 's/;date.timezone =/date.timezone = Asia\/Seoul/g' /etc/php.ini

diff /etc/php.ini.old /etc/php.ini


- 직접수정

vi /etc/php.ini

date.timezone = Asia/Seoul

위에처럼 주석을 제거하고 값을 넣어준다.


* 확인

php -r "echo date('Y-m-d H:i:s').PHP_EOL;"

service httpd restart

다음과 같은 오류가 발생한다면???


selinux 설정을 해제 해주어야합니다.


1. 일시적인 방법


setenforce 0


2. /etc/selinux/config 파일수정


vi편집기를 이용해서 


# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

빨간색으로 표시된 부분을


SELINUX=disabled

으로 수정합니다.


1. Apache설치 사이트


https://zetawiki.com/wiki/CentOS_%EC%95%84%ED%8C%8C%EC%B9%98_%EC%84%A4%EC%B9%98


- 설치확인하기


rpm -qa httpd


yum list httpd 


- 설치하기


yum install httpd



- 서비스시작하기


service httpd start



- 재부팅시 자동 시작하기


chkconfig --list httpd


chkconfig httpd on



2. MariaDB설치 사이트


https://zetawiki.com/wiki/CentOS_MariaDB_%EC%84%A4%EC%B9%98


- 설치 확인하기


rpm -qa | grep MariaDB


- 저장소 추가하기


- 일단 확인하기


yum repolist


vi /etc/yum.repos.d/MariaDB.repo


- 밑에 내용넣기


[mariadb]

name = MariaDB

baseurl = http://yum.mariadb.org/10.2/centos6-amd64

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1


- 이건 저장소제거하기


rm -f /etc/yum.repos.d/MariaDB.repo


- 설치하기


yum install MariaDB-server


- db시작하기


/etc/init.d/mysql start


- db비밀번호 설정하기


/usr/bin/mysqladmin -u root password '비밀번호넣기'


netstat -anp | grep 3306


- db접속하기


mysql -uroot -p


- 부팅시 자동시작 설정하기


chkconfig mysql on


chkconfig --list mysql



3. PHP설치 사이트


https://zetawiki.com/wiki/CentOS_6%EC%97%90_PHP_5.3_%EC%84%A4%EC%B9%98_(yum)


- 설치확인하기


rpm -qa | grep php


yum list php


- 설치하기


yum install php


- 확인하기


php -v


4. PHP버전 5.6으로 다시 설치하기


http://hotman.tistory.com/261


- MariaDB와 연동하기


mysql연동과 다르게 밑의 과정으로 연동한다


Warning –> mysqli_connect(): Headers and client library minor version mismatch. 

이런 오류가 발생한다면!!


# yum erase php-mysql


# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm


# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm


# yum install php-mysqlnd


안된다면


# yum --enablerepo=remi,remi-test install php-mysqlnd


# service mysql restart




1. 설치 전 확인


rpm -qa | egrep "^(httpd|php|mysql)"


2. 설치


yum install httpd mysql mysql-server php php-mysql


3. 설치 후 확인


rpm -qa | egrep "^(httpd|php|mysql)" | sort -n


4. 서비스 등록 확인


service httpd status
service mysqld status
php -v


5. httpd 시작 및 설정


service httpd start


6. mysqld 시작테스트


servicce mysqld start


7. Mysql 패스워드 지정, 테스트


/usr/bin/mysqladmin -u root password '1234'
mysql -u root -p


8. 재부팅시 자동시작 설정


chkconfig --list | egrep "mysqld|httpd"
chkconfig mysqld on
chkconfig httpd on
chkconfig --list | egrep "mysqld|httpd"


+ Recent posts