nos*_*omo 5 java mysql unicode jdbc utf-8
由于某些奇怪的原因,我似乎无法将UTF-8数据添加到我的MySQL数据库中.当我输入一个非拉丁字符时,它存储为?????.其他一切都存储得很好.因此,例如,"这是一个示例®™"存储得很好,但"和中辞典"存储为"????".
连接网址很好:
private DataSource getDB() throws PropertyVetoException {
ComboPooledDataSource db = new ComboPooledDataSource();
db.setDriverClass("com.mysql.jdbc.Driver");
db.setJdbcUrl("jdbc:mysql://domain.com:3306/db?useUnicode=true&characterEncoding=UTF-8");
db.setUser("...");
db.setPassword("...");
return db;
}
Run Code Online (Sandbox Code Playgroud)
我正在按照您的预期使用PreparedStatement,我甚至尝试按照某人的建议输入"set names utf8".
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = db.getConnection();
stmt = conn.prepareStatement("set names utf8");
stmt.execute();
stmt = conn.prepareStatement("set character set utf8");
stmt.execute();
... set title...
stmt = conn.prepareStatement("INSERT INTO Table (title) VALUES (?)");
stmt.setString(1,title);
stmt.execute();
} catch (final SQLException e) {
...
Run Code Online (Sandbox Code Playgroud)
表本身似乎很好.
Default Character Set: utf8
Default Collation: utf8_general_ci
...
Field title:
Type text
Character Set: utf8
Collation: utf8_unicode_ci
Run Code Online (Sandbox Code Playgroud)
我通过GUI编辑器输入Unicode(特别是"和中辞典")然后从表中选择来测试它 - 它返回得很好.所以这似乎是JDBC的一个问题.
我错过了什么?
为了正确设置 UTF-8 字符集,mysql 服务器中有 2 个点需要检查。
数据库层
这是通过创建它获得的:
CREATE DATABASE 'db' CHARACTER SET 'utf8';
Run Code Online (Sandbox Code Playgroud)
表层
所有表格也需要采用 UTF-8 格式(您似乎就是这种情况)
CREATE TABLE `Table1` (
[...]
) DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)
重要的部分是DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci
最后,如果您的代码没有正确处理 utf8,您可以通过在启动时更改设置来强制 JVM 使用 utf8 编码:
java -Dfile.encoding=UTF-8 [...]
Run Code Online (Sandbox Code Playgroud)
或者改变环境变量
"**JAVA_TOOLS_OPTIONS**" to -Dfile.encoding="UTF-8"
Run Code Online (Sandbox Code Playgroud)
或以编程方式使用:
System.setProperty("file.encoding" , "UTF-8");
Run Code Online (Sandbox Code Playgroud)
(最后一个可能不会达到预期的效果,因为 JVM 在启动时缓存默认字符编码的值)
希望有帮助。
| 归档时间: |
|
| 查看次数: |
9469 次 |
| 最近记录: |