我在Docker容器中创建了一个mariadb数据库,然后使用SQuirreL的“创建数据脚本”操作从旧版本的应用程序复制了一些数据,该操作生成了一堆“INSERT INTO”语句。这一切都运行良好,我们已经将新数据写入数据库几周。
昨天有人报告说试图保存新数据时出错,我从日志中发现了这个:
Caused by: org.mariadb.jdbc.internal.util.dao.QueryException: Incorrect string value: '\xC2\x95\x09Onb...' for column 'ssimpact' at row 1
我确定他们试图保存的文字是从他们在Outlook中收到的电子邮件中复制的“子弹”字符。我尝试了类似的测试,在MS Word文档中创建一个子弹并将其复制到文本字段并尝试保存它,这会产生相同的错误。
所以,我显然有一个字符编码问题。用户有一个解决方法,只需用星号替换子弹字符,但我想避免使用此解决方法。
我注意到当我在SQuirreL中运行“SELECT * FROM INFORMATION_SCHEMA.SCHEMATA”时,它显示我的数据库的charset和collation是“latin1”和“latin1_swedish_ci”,但是还有“information_schema”数据库,其中“ utf8“和”utf8_general_ci“。
我是否需要使用“utf8”和“utf8_general_ci”创建此数据库以避免此问题?
假设情况确实如此,并且我不想重新创建数据库并重新复制所有数据,如果我执行以下操作:
ALTER TABLE table_name CONVERT TO CHARACTER SET 'utf-8' COLLATE 'utf8_general_ci';
对于可能获得这些“特殊”字符的所有表,是否会解决此问题?我还需要做其他事吗?