MariaDB: mysql Ver 15.1 Distrib 10.3.8-MariaDB
OS: Windows 7 Pro 64 bit我把我的服务器数据库和客户端都设置好了(我相信)来支持utf8端到端-
(**my.cnf**)
#
# Set everything to utf8
#
# (per https://mariadb.com/kb/en/library/setting-character-sets-and-collations/)
#
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
(**Console**)
chcp
Active code page: 65001
(**Mysql client**)
show variables like '%char%';
+--------------------------+-----------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MariaDB 10.3\share\charsets\ |
+--------------------------+-----------------------------------------------+通过从csv文件导入unicode字符,我可以在数据库中存储和显示unicode字符,如micron ()、Omega (Ω)和em dash (-)。
然而,当我开始使用unicode字符尝试一些查询时,我遇到了一个问题。基本上,在引用字符串中输入“超过7位”unicode字符似乎会向mysql客户端隐藏结束引号,而mysql客户端则停留在引号模式中。简单的例子如下-
MariaDB [uom]> -- Using plain ASCII- this works
MariaDB [uom]> select replace('cm', 'c', 'm');
+-------------------------+
| replace('cm', 'c', 'm') |
+-------------------------+
| mm |
+-------------------------+
1 row in set (0.000 sec)
MariaDB [uom]> -- Try using a unicode character in the query, this fails
MariaDB [uom]> select replace('µm', 'µ', 'u');
'>
'>
'> '
-> ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1有趣的是,如果我非交互地运行相同的查询,它就会执行,但是输出似乎表明mysql命令行路径中有什么东西没有使用unicode,因为unicode字符被转换为"?“在输出上-
mysql -e "select replace('µm', 'µ', 'u');"
+-------------------------+
| replace('?m', '?', 'u') |
+-------------------------+
| um |
+-------------------------+很明显我漏掉了一块拼图。任何想法都很受欢迎。
我正在开发一个非生产数据库,所以我能够(我想)将所有的东西从上到下设置为utf8mb4,并重新导入我的数据。还能看到奇怪的东西-
在my.cnf中,系统仍然报告在重新启动服务器后将其设置为"utf8“。如果我在客户机中以交互方式发出逗号和set character_set_server='utf8mb4';,变量会更改会话的值,但这不会影响其他问题。
应该是十六进制B5的“微”字符被存储为xC2B5,这是一个中文/汉格尔字符。由于服务器、客户端和连接都设置为utf8mb4,并且我正在导入的csv文件标识为latin1,我无法理解为什么会发生双重编码。
myql客户端程序的奇怪之处(发射"?“)命令中的字符,即使它设置为utf8mb4运行-
mysql -e "select replace('µm', 'µ', 'u');"
+-------------------------+
| replace('?m', '?', 'u') |
+-------------------------+
| um |
+-------------------------+
mysql -e "show variables like '%char%';"
+--------------------------+-----------------------------------------------+
| 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 | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MariaDB 10.3\share\charsets\ |
+--------------------------+-----------------------------------------------+输入查询字符串(包括微符号之类的字符)的阻塞也在继续。
它看起来要么是Mariadb客户端没有正确地实现它给定的字符集设置,要么是Windows本身在破坏环境中的一些东西。
最后,我可能会在linux上尝试确定到底是Mariadb端还是操作系统造成了问题。
发布于 2019-02-17 01:45:14
使用cmd提示符时,将该窗口设置为使用代码页chcp 65001:
命令"chcp“控制”代码页“。chcp 65001提供了utf8,但它也需要安装一个特殊的字符集。一些代码页。要在控制台窗口中设置字体:右键单击窗口的标题→属性→字体→选择Lucida控制台
另见https://dev.mysql.com/doc/refman/5.6/en/mysql-tips.html#windows-unicode-support
https://dba.stackexchange.com/questions/229845
复制相似问题