我有一个包含带重音符号的法语单词列表的数据库。
我的问题是,当我尝试“选择长度(”é“)时,”它总是返回2.所以如果我需要用7个字母来获取所有单词,它将永远无法工作。
我尝试了以下内容:
ALTER DATABASE my_database CHARACTER SET utf8 COLLATE utf8_bin
ALTER TABLE my_table CHARACTER SET utf8 COLLATE utf8_bin
但它没有改变任何东西。我也尝试过latin1 / latin1_bin和utf16 / utf16_bin,没有变化。
谢谢。
答案 0 :(得分:1)
使用CHAR_LENGTH()
代替LENGTH()
。 LENGTH
返回字节长度,在utf-8中不总是1。
答案 1 :(得分:1)
LENGTH函数返回字节数。
您需要使用CHAR_LENGTH()函数,它返回字符数,而不管字节数。
答案 2 :(得分:0)
您的ALTER
语句不起作用的原因是它们只为新创建的表格对其文本进行编码的方式设置规则。对于已存在的表,ALTER
语句不会改变任何内容。
我找到了this great blog post,其中介绍了如何使用iconv
将现有MySQL数据库从latin1
转换为utf8
。这是命令:
mysqldump --add-drop-table my_database | replace CHARSET=latin1
CHARSET=utf8 | iconv -f latin1 -t utf8 | mysql my_database
提及LENGTH()
和CHAR_LENGTH()
之间区别的其他答案是正确的,您也应该注意这一点。
答案 3 :(得分:0)
“选择长度(”é“)”它总是返回2.
这意味着您可能已经正确设置了架构。除非有其他问题,否则不要做任何改动。
进一步确认SELECT HEX(col) ...
- 您应该看到C3A9
é
;这是utf8编码的十六进制。