问题描述
第一次用 tidb ,网页版通过 csv 倒入,其中有一列是 int 的material_id,并不是连续的,导入的选项勾选了 primary key ,数据导入倒是没问题,使用
select * from mytable limit 1这种没问题,但是使用
select material_id from mytable limit 1会报错
更有意思的是,如果使用网页版,输入`material_id`过程中,如果用 tab 进行补全,前边自动加了个红点,类似于sql select ·material_id from mytable limit 1
反而正常了。网页版不用补全的话,还是报错。用\`\`包上`material_id`也不行。 删掉表,重新倒入,不再勾选 primary key ,还是有同样的问题。
同一个 csv 倒入到 mysql 倒是没有类似的问题。
### 解决方式
那个小红点单独粘不出来,但是连着前边的空格,可以粘出来,检测出来 unicode 是 65279 ,然后通过 go
SQL := fmt.Sprintf(“SELECT %cmaterial_id FROM mytable LIMIT 1”, 65279)
```
倒是在业务代码里实现正常查询了。
65279 对应十六进制 FEFF ,也就是 Unicode Byte Order Mark (BOM)。
csv 文件为了解决 excel 打开的中文乱码问题,手动设置过 BOM ,在导入到 tidb 的时候,U+FEFFmaterial_id 被当成了一个整体
拓展
BOM是为了解决 字节大端/小端 问题的,比如,一个16位的Unicode字符U+FEFF,在大端模式下,它的BOM是FE FF;在小端模式下,它的BOM是FF FE。
utf-8的字节顺序不影响字符的表示,所以不需要BOM。
而excel默认用的ANSI编码,直接打开csv,可能会出现乱码,这有两个解决办法 - 使用编辑器,保存csv为utf8 + BOM - 使用excel的导入功能,选择utf8