mysql 中文字符匹配问题

Fallenking 2009-02-19 02:07:47
是这样的,要查询存放 文件名信息的表(file_table),文件名是中文的。可是select
* from file_table where filename like "%文字%";这个参数是中文的,查询语句取不出
来信息,结果是空。 而且我也试过 set names utf8。

请问这个怎么解决? 谢谢牛牛们~
...全文
637 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fallenking 2009-02-21
  • 打赏
  • 举报
回复
问题解决了,是这样的,字符匹配时将匹配字符的转成16进制。
之前应该将数据库的字符集设定成中文字符集,如何设定和调整字符集参见
http://blog.donews.com/yllr/archive/2007/01/03/1107388.aspx
存储在表中的数据是不会改变的,这个取决于存储之前的字符设定。

1. set names 'gbk' //日文字符是sjis,注意utf8和gbk还有sjis是有区别的
mysql> set names 'gbk';
mysql> select HEX(convert('能力' using utf8));
+---------------------------------+
| HEX(convert('能力' using utf8)) |
+---------------------------------+
| E693BBE6A4A1 |
+---------------------------------+
mysql> set names sjis;
mysql> select HEX(convert('能力' using utf8));
+---------------------------------+
| HEX(convert('能力' using utf8)) |
+---------------------------------+
| E883BDE58A9B |
+---------------------------------+
mysql> select HEX('能力');
+-------------+
| HEX('能力') |
+-------------+
| 9497CD |
+-------------+


2.将表中的数据转成十六进制,因为我的源表为日文集,以之为例,中文集亦然:
select hex(filename) from file_table;
....
| 35E68BBFE68D952E747874 |
| 36E794B3E8AB8B2E747874 |
| 31E883BDE58A9B2E747874 |
| 32E4BA88E683B32E747874 |
| 33E7A684E9AB982E747874 |
| 34E6A78BE7AF892E747874 |
.....

可以看到1.设定为日文集的十六进制码(E883BDE58A9B),可以在表中匹配着

3.因此总的sql为

mysql>set names 'gbk';
mysql>select filename from ark_dhsm_file where cast(hex(filename) as char) like concat(‘%’,cast(hex(convert('能力' using utf8))as char),’%’)


感谢1,6楼的提示,4楼也有帮助。 谢谢大家的回帖,总结一下攒rp,下次再提问会有人回~哈哈
Fallenking 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wwwwb 的回复:]
将字符集修改后要重新UPDATE表中的记录才行。
[/Quote]

update file_table set filename = '1能力.txt'where id = 1;

select结果:
select filename from ark_dhsm_file where filename like '%1%';
+-------------------------------------------------------+
| filename |
+-------------------------------------------------------+
| 1???.txt |

为什么还是乱码捏?
wwwwb 2009-02-20
  • 打赏
  • 举报
回复
将字符集修改后要重新UPDATE表中的记录才行。
Fallenking 2009-02-20
  • 打赏
  • 举报
回复
再有的信息是:

file_table.filename 列的type是text的,collation改成utf,之前默认的是latin1
Fallenking 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yangxiao_jiang 的回复:]
select * from file_table where filename like BINARY '%文字%';

这样可以。
[/Quote]

表里面有这样的数据 “1能力.txt” 第一遍我查询 “能力”

select filename from file_table where filename like binary '%能力.txt%';
Empty set (0.00 sec)

第二遍我查询 “1”,结果很多我截取需要的那个结果
select filename from file_table where filename like binary '%1%';
+-------------------------------------------------------+
| filename |
+-------------------------------------------------------+
| 1将イ??将ゥ宵゙?.txt |
+-------------------------------------------------------+
23 rows in set (0.00 sec)
yangxiao_jiang 2009-02-20
  • 打赏
  • 举报
回复
select * from file_table where filename like BINARY '%文字%';

这样可以。
Fallenking 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ACMAIN_CHM 的回复:]
set names 'gbk'

试试
[/Quote]

试过,乱码不一样了。
ACMAIN_CHM 2009-02-20
  • 打赏
  • 举报
回复
set names 'gbk'

试试
Fallenking 2009-02-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Fallenking 的回复:]
我的表格内容是乱码的,我尝试过 将表列 alter 成utf8的 结果不成
SQL codeALTERTABLEark_dhsm_fileCONVERTTOCHARACTERSETutf8 COLLATE utf8_unicode_ci;
[/Quote]

补充我的环境是windows 下mysql
Fallenking 2009-02-20
  • 打赏
  • 举报
回复
我的表格内容是乱码的,我尝试过 将表列 alter 成utf8的 结果不成

ALTER TABLE ark_dhsm_file CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
he2005 2009-02-20
  • 打赏
  • 举报
回复
有同样的问题
期待高手解决
Fallenking 2009-02-20
  • 打赏
  • 举报
回复
我将文件名给转成十六进制,我想即使乱码,也是现实的问题。

select hex(filename) from ark_dhsm_file;
+------------------------------------------------------------+
| hex(filename) |
+------------------------------------------------------------+
...
36E794B3E8AB8B2E747874 ———————————(1)
...
35 rows in set (0.00 sec)

然后又将 需要匹配的文字转成十六进制
select hex('文字'); //注:该文字我替换了,下面的十六进制码也许和您的得到的不一样,这不是问题的主要原因
905C90BF —————————————(2)

我认为(2)的应该可以在(1)中找到,这样就可以匹配着。可这是我一厢情愿,还是没能成功。介个大牛们给分析一下~

百年树人 2009-02-19
  • 打赏
  • 举报
回复
select * from file_table where locate(filename,'文字')>0;

或者

select * from file_table where filename like BINARY '%文字%';

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧