iT邦幫忙

2

MYSQL 搜寻字母符号问题

Ks 2018-06-16 23:58:181739 瀏覽

资料库是mysql,
搜寻žř这样的特殊文字会被当成zr来处理,
请问有什么解决办法呢?
比如有2笔资料分别是žybřidcz和zybridcz,
我下指令
select * from db where text= 'žybřidcz' 或
select * from db where text= 'zybridcz'
结果2笔都会出来.

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

4
暐翰
iT邦大師 1 級 ‧ 2018-06-17 00:00:40
最佳解答

用ASCII解決

CREATE TABLE db 
    (`text` varchar(8))
;
    
INSERT INTO db 
    (`text`)
VALUES
    ('žybřidcz'),
    ('zybridcz')
;

select * from db where ASCII(text)= ASCII('zybridcz')
|     text |
|----------|
| zybridcz |

SQL Fiddle 測試連結

看更多先前的回應...收起先前的回應...
Ks iT邦新手 3 級 ‧ 2018-06-17 00:11:41 檢舉

感谢回复,刚试着用ASCII,
但是这样会跑出这样的结果来/images/emoticon/emoticon02.gif
zybridcz
zj9o4j6w
zyj0y9knt
zwe0gcny
zy11111

Ks iT邦新手 3 級 ‧ 2018-06-17 00:14:53 檢舉

问题解决了,感谢帮助,我在后面加上,就可以了
select * from db where ASCII(text)= ASCII('zybridcz')
and text= 'zybridcz'

Ks iT邦新手 3 級 ‧ 2018-06-17 00:21:45 檢舉

抱歉..刚发现如果是这样tuấn,tuan就不行了
会连同2个一起跑出来

Ks iT邦新手 3 級 ‧ 2018-06-17 00:21:46 檢舉

抱歉..刚发现如果是这样tuấn,tuan就不行了
会连同2个一起跑出来

暐翰 iT邦大師 1 級 ‧ 2018-06-17 00:37:50 檢舉

ASCII不行改用HEX
效能會差點

select * from db where HEX(text)= HEX('zybridcz')

嗯@@~我拿你的語法來~
我問你~如果改用INSTR效能如何呢?
因為我不知道~怎麼看出效能差別..

CREATE TABLE db 
    (`text` varchar(8))
;
    
INSERT INTO db 
    (`text`)
VALUES
    ('tuấn'),
    ('tuan'),
    ('žybřidcz'),
    ('zybridcz')
;

select *,ASCII(text),HEX(text) 
from db 
where INSTR(text,'tuan') > 0

http://sqlfiddle.com/#!9/e8f487/4

暐翰 iT邦大師 1 級 ‧ 2018-06-17 17:22:08 檢舉

純真的人大大
資料大小差異導致效能有差,ASCII是10進制、HEX是16進制
得出來資料 HEX > ASCII
轉換、比較資料需要的時間也就變大


INSTR也是一個好選擇呢
效能要壓力測試來跑跑看

喔~~那裡可以去測效能要壓力測試??
還是要自己的主機XD

暐翰 iT邦大師 1 級 ‧ 2018-06-17 17:59:49 檢舉

用自己主機
我晚上很晚才用的到電腦,再來測試XD

喔喔~~ok~

3
一級屠豬士
iT邦新手 2 級 ‧ 2018-06-17 21:50:52
使用Postgresql 輕鬆愉快

create table ithelp180617a (
  id serial primary key
, val text not null
);

insert into ithelp180617a (val) values
('žybřidcz'), ('zybridcz');

select distinct val
  from ithelp180617a;

   val    
----------
 žybřidcz
 zybridcz
(2 筆資料列)

select val, count(*)
  from ithelp180617a
 group by val;  
 
   val    | count 
----------+-------
 žybřidcz |     1
 zybridcz |     1
(2 筆資料列)

select *
  from ithelp180617a
 where val = 'žybřidcz';

 id |   val    
----+----------
  1 | žybřidcz
(1 筆資料列)

Ks iT邦新手 3 級 ‧ 2018-06-18 00:14:30 檢舉

對啊,在postgresql不會有這樣的問題,但是在mysql卻發生了/images/emoticon/emoticon02.gif

我要發表回答

立即登入回答