文章出處

微信呢稱和QQ呢稱上有很多火星文和emoji表情圖片,這些數據,如果直接insert到mysql數據庫,一般會報錯,設置成utf8都不好使,必須改成utf8mb4編碼,這二者的區別見: mysql utf8mb4與emoji表情 ,網上的解決辦法大多是修改my.cnf參數,設置mysql的編碼為utf8mb4,這種方法雖然徹底,但是通常要重啟mysql,會造成生產系統臨時當機。

下面是影響相對更小的處理方法:

前提:mysql的版本不能太低,低于5.5.3的版本不支持utf8mb4編碼。

將表中的對應字段,比如會員表的呢稱字段,其字符集修改成utf8mb4。

然后在java客戶端,將mysql-connector-java升級成最新版(目前最新版是5.1.37),最后修改druid數據源的配置,增加一行:

<property name="connectionInitSqls" value="set names utf8mb4;"/>

完整配置參考下面:

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${jdbc-driver}"/>
        <property name="url" value="${jdbc-url}"/>
        <property name="username" value="${jdbc-user}"/>
        <property name="password" value="${jdbc-password}"/>
        <property name="filters" value="stat"/>
        <property name="maxActive" value="20"/>
        <property name="initialSize" value="1"/>
        <property name="maxWait" value="60000"/>
        <property name="minIdle" value="1"/>
        <property name="timeBetweenEvictionRunsMillis" value="3000"/>
        <property name="minEvictableIdleTimeMillis" value="300000"/>
        <property name="validationQuery" value="SELECT 'x'"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>
        <property name="poolPreparedStatements" value="true"/>
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
        <property name="connectionInitSqls" value="set names utf8mb4;"/>
    </bean>

基本上應該就可以了,如果還不行,檢查下jdbc連接串的設置:

jdbc:mysql://localhost:3306/db名稱?useUnicode=true&characterEncoding=utf8

再不行的話,把最后的?useUnicode=true&characterEncoding=utf8 去掉


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()