union all 한글 검색 관련 질문입니다.
본문
해결이 난해한 오류가 있어서 글을 올립니다.
옐르들어
g5_write_table1
g5_write_table2 가 있습니다.
여기서 뷰테이블이 각테이블 하나씩 바라보게 하여 view_table1,view_table2 를 만들었습니다.
SELECT wr_id,wr_subject FROM view_table1 WHERE wr_subject LIKE '%한글%' ;
SELECT wr_id,wr_subject FROM view_table2 WHERE wr_subject LIKE '%한글%' ;
이렇게 했을시 이상없이 잘 처리가 됩니다. 다만, 뷰 테이블을 g5_write_table1,g5_write_table2를 합쳐서 view_table로 임의로 생성했을시, 한글 검색이 안되는 문제가 생겼습니다.
CREATE
VIEW `view_table`
AS select
`g5_write_table1`.`wr_id` AS `wr_id`,
`g5_write_table1`.`wr_subject` AS `wr_subject`
from `g5_write_table1`
union all
select
`g5_write_table2`.`wr_id` AS `wr_id`,
`g5_write_table2`.`wr_subject` AS `wr_subject`
from `g5_write_table2`
그리하여
SELECT wr_id,wr_subject FROM view_table WHERE wr_subject LIKE '%한글%' ;
쿼리를 실행하면, error도 없이 아무것도 안나오네요.(영어 및 숫자는 잘 처리됩니다.)
오류를 굳이 나오게 하니,
Warning: #1300 Cannot convert string '%\xEC\x98\x88\xEC\x95...' from utf8mb4 to binary
이렇게 나옵니다.
db역시 utf8mb4로 생성되어있고, 각 테이블 캐릭터셋 및 필드도 utf8mb4, 콜레이션 utf8mb4_general_ci로 설정되어있습니다.[mysql8]
+----------------------------------------------+----------------------------+
| Variable_name | Value |
+----------------------------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb4 |
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------------------------------+----------------------------+
제가 놓치고 있는게 있는지 혹은 이 증상 겪어본이 계시거나 비슷한 경험이 있는지요?
!-->답변 6
검색되는 변수 그부분에서 한글이 깨져요
근데 create view는 뭔가요 셀렉트에서만 가능할건데
view를 생성할때 인코딩지정을 해보셔야 할것같습니다.
아무래도 view를 생성하면서
dbms의 메모리에 할당되는 컬럼의 인코딩은
database 기본값을 따를것인데
미지정시 무엇이 되는지 알수없다는것이죠
OS를 따를지 DBMS를 따를지 기본값이 무엇인지 등등의 변수가 존재할수있으니
CREATE
VIEW `view_table`
AS select
`g5_write_table1`.`wr_id` AS `wr_id`,
`g5_write_table1`.`wr_subject` AS `wr_subject`
from `g5_write_table1` COLLATE utf8mb4
union all
select
`g5_write_table2`.`wr_id` AS `wr_id`,
`g5_write_table2`.`wr_subject` AS `wr_subject`
from `g5_write_table2` COLLATE utf8mb4;
와 같이 강제 지정을 해보시고
그래도 한글이 깨지면 utf8mb4_general_ci 로변경해서 한번더해보시는것도 추천합니다.
참고
https://stackoverflow.com/questions/46353062/mysql-5-6-create-view-with-unicode-character-set
!-->show create table 하셔서
wr_subject의 character set도 확인해 보세요.
Select * from (
SELECT wr_id,wr_subject FROM view_table1
Union
LECT wr_id,wr_subject FROM view_table2 )
Vtbl WHERE wr_subject LIKE '%한글%'
이렇게 해도 에러가 나나요?
... WHERE wr_subject LIKE binary '%한글%'
이렇게 한번 해보세요
마지막으로 query 실행전에
set names utf8mb4
한번 실행해 보세요.